mysql update改动多条数据

it2025-09-25  100

通常情况下,我们会使用下面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标准语法!

转载于:https://www.cnblogs.com/bhlsheji/p/4295090.html

最新回复(0)