zoukankan      html  css  js  c++  java
  • mysql update改动多条数据

    通常情况下,我们会使用下面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标准语法!
  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4295090.html
Copyright © 2011-2022 走看看