• 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标准语法!
  • 相关阅读:
    关于Weblogic的知识点
    关于Linux常用命令的使用
    VirtualBox虚拟机下Linux CentOS6.9安装增强功能
    并发与高并发(一)-缓存一致性
    麦田厦门小区信息数据爬取
    CRM 增加信息不进行readonly,自定义user
    CRM form按field自定义,多选readonly
    CRM readonly、Form and field validation——第27天
    CRM action 多选框删除——第25,26天
    CRM删除数据——24天
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4295090.html
Copyright © 2020-2023  润新知