当前位置:  数据库>sqlserver

一条sql语句update更新多条记录教程详解

    来源: 互联网  发布时间:2014-08-29

    本文导语:  如果想更新多行数据,并且每行记录的各字段值都是各不一样,有什么好的方法吗? 通常情况下,会使用以下sql语句来更新字段值:   代码示例: update mytable set myfield='value' where other_field='other_value'; 举个例子,我的博客有三...

如果想更新多行数据,并且每行记录的各字段值都是各不一样,有什么好的方法吗?

通常情况下,会使用以下sql语句来更新字段值:
 

代码示例:
update mytable set myfield='value' where other_field='other_value';

举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条update语句的方式,就像以下的php程序示例:
 

代码示例:
foreach ($display_order as $id => $ordinal) {
$sql="update categories set display_order = $ordinal where id = $id";
mysql_query($sql);
}

这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次sql查询,在做系统优化时,总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。

更好的解决方案,下面列举两种常用的方案只不过sql语句稍微复杂点,但是只需执行一次查询即可,语法如下:

第一种:if--then语句结合
 

代码示例:
update mytable
set myfield = case other_field
when 1 then 'value'
when 2 then 'value'
when 3 then 'value'
end
where id in (1,2,3)

回到刚才的分类目录的例子,可以使用以下sql语句:
 

代码示例:
update categories
set display_order = case id
when 1 then 3
when 2 then 4
when 3 then 5
end,
title = case id
when 1 then 'new title 1'
when 2 then 'new title 2'
when 3 then 'new title 3'
end
where id in (1,2,3)

以上方案大大减少了数据库的查询操作次数,大大节约了系统资源,但是该怎样与编程语言结合起来?
还是用刚才分类目录的例子,以下是php的程序示例:
 

代码示例:
$display_order = array(
1 => 4,
2 => 1,
3 => 2,
4 => 3,
5 => 9,
6 => 5,
7 => 8,
8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "update categories set display_order = case id ";
foreach ($display_order as $id => $ordinal) {
$sql .= sprintf("when %d then %d ", $id, $ordinal); // 拼接sql语句
}
$sql .= "end where id in ($ids)";
echo $sql;
mysql_query($sql);

在这个例子中总共更新了8行数据,但是只执行了一次数据库查询,相比于循环执行8次update语句,以上例子所节约的时间可以说是微不足道的。
当需要更新10,0000或者更多行记录时,会发现这其中的好处!
需要注意的问题是sql语句的长度,需要考虑程序运行环境所支持的字符串长度,目前获得的数据:sql语句长度达到1,000,960在php中仍然可以顺利执行,查询了php文档并没有发现明确规定字符串最大长度。

第二种insert方式
mysql中insert语法具有一个条件duplicate key update,这个语法和适合用在需要判断记录是否存在,不存在则插入存在则更新的记录。
基于上面这种情况,针对更新记录,仍然使用insert语句,不过限制主键重复时,更新字段。
如下:
 

代码示例:
insert into t_member (id, name, email) values
(1, 'nick', 'nick@126.com'),
(4, 'angel','angel@163.com'),
(7, 'brank','ba198@126.com')
on duplicate key update name=values(name), email=values(email);

注意:on duplicate key update只是mysql的特有语法,并不是sql标准语法!


    
 
 

您可能感兴趣的文章:

  • mysqli多条sql语句查询实例
  • mysqli多查询特性 实现多条sql语句查询
  • php CI框架插入一条或多条sql记录示例
  • JSP 多条SQL语句同时执行的方法
  • 把一个字段内用逗号分隔的内容分成多条记录的sql代码
  • sql server与mysql中update多条数据
  • 通过T_sql语句向其中一次填入一条数据或一次填入多条数据的方式填充数据
  • 执行一条sql语句update多条记录实现思路
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Mysql增加主键或者更改表的列为主键的sql语句
  • sql语句实例 取得日志条目的sql语句
  • Mysql下在某一列后即表的某一位置添加新列的sql语句
  • SQL Server统计SQL语句执行时间的脚本
  • sql语句实例 统计页面链接的sql语句
  • 如何实现连接一次数据库,提交多个sql语句。(sql的批处理)
  • 一条SQL语句搞定Sql2000 分页
  • C#中验证sql语句是否正确(不执行语句)
  • SQL Server数据库的修复SQL语句
  • SQL 语句拦截 P6SPY
  • C#使用带like的sql语句时防sql注入的方法
  • t-sql/mssql用命令行导入数据脚本的SQL语句示例
  • 在SQL Server的try...catch语句中获取错误消息代码的的语句
  • sql2005创建远程登录帐户的sql语句分享
  • SQL SERVER 查询正在实行的SQL语句
  • SQL语句中含有乘号报错的处理办法
  • sql无效字符引起的执行sql语句报错的解决方法
  • C#代码验证sql语句是否正确(只验证不执行sql)的方法
  • SQL Server中选出指定范围行的SQL语句代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sql 版本详解 让你认识跟sql2000的区别
  • sql语言中delete删除命令语句详解
  • 探讨:sql插入空,默认1900-01-01 00:00:00.000的解决方法详解
  • sql server日期相减 的实现详解
  • 使用SQL Server判断文件是否存在后再删除(详解)
  • 深入SQL Server中定长char(n)与变长varchar(n)的区别详解
  • sql server定义联合主键的方法详解
  • Sql Server使用cursor处理重复数据过程详解
  • 深入SQL截取字符串(substring与patindex)的详解
  • SQL Server UPDATE语句的用法详解
  • 深入SQL SERVER合并相关操作Union,Except,Intersect的详解
  • 深入sql多表差异化联合查询的问题详解
  • oracle SQL递归的使用详解
  • SQL server 2005 判断表是否存在的方法详解
  • SQL Server正则表达式 替换函数应用详解
  • 基于SQL中SET与SELECT赋值的区别详解
  • 在sql server代理中配置邮件会话的方法详解
  • sql2005中创建CLR存储过程的方法详解
  • SQL实现递归及存储过程中In()参数传递解决方案详解
  • 深入sql server 2005 万能分页存储过程的详解
  • java命名空间java.sql接口statement的类成员方法: executeupdate定义及介绍
  • 请问,这是什么错误!java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][Named Pipes]??????? SQL Server?虽然分少,但一定给,只要您是前5名回复者中最好的以为!
  • java命名空间java.sql接口connection的类成员方法: nativesql定义及介绍
  • SQL查询分析工具 SQL Workbench/J
  • java命名空间java.sql接口preparedstatement的类成员方法: executeupdate定义及介绍
  • SQL客户端软件 PKLite SQL Client
  • java命名空间java.sql接口rowid的类成员方法: getbytes定义及介绍
  • SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
  • java命名空间java.sql接口ref的类成员方法: getbasetypename定义及介绍
  • SQL客户端管理工具 SQuirreL SQL Client
  • java命名空间java.sql接口databasemetadata的类成员方法: getsqlkeywords定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3