zoukankan      html  css  js  c++  java
  • mysql 批量更新多条记录(且不同值)的实现方法

    mysql更新语句很简单,更新多条数据的某个字段为相同值,一般这样写:
    UPDATE table_name SET field = 'value' WHERE condition;
    更新多条数据为不同值,你可以:
    foreach ($display_order as $id => $ordinal) { 
        $sql = "UPDATE categories SET display_order = $ordinal WHERE id = $id"; 
        mysql_query($sql); 
    }
    这样一条条进行,虽然性能差,还容易阻塞。
    你也可以用一些SQL的小技巧:
    UPDATE table_name 
        SET field = CASE id 
            WHEN 1 THEN 'value'
            WHEN 2 THEN 'value'
            WHEN 3 THEN 'value'
        END
    WHERE id IN (1,2,3);

    然而这样在记录量很大的情况下仍然性能很差,然后我们考虑使用:

    REPLACE INTO table_name (id,data) VALUES (1,'2'),(2,'3'),...(x,'y');
    INSERT INTO table_name (id,data) VALUES (1,'2'),(2,'3'),...(x,'y') ON DUPLICATE KEY UPDATE data=VALUES(data);

    REPLACE INTO  操作本质是对重复的记录先 DELETE 后 INSERT,如果更新的字段不全会将缺失的字段置为缺省值;INSERT INTO 则是只更新重复记录,不会改变其它字段。

    如果这样性能仍显不足,我们还可以通过创建临时表来再次提速:
    create temporary table tmp(id int(4) primary key,dr varchar(50));
    insert into tmp values  (0,'gone'), (1,'xx'),...(m,'yy');
    update test_tbl, tmp set test_tbl.dr=tmp.dr where test_tbl.id=tmp.id;

    创建临时表,更新临时表,从临时表更新。

  • 相关阅读:
    spring容器与java访问权限的关系!
    Mybatis初始化过程详解
    Spring-boot 一些常用注解说明!
    JNDI + Spring 如何读取数据
    HashMap,,ConcurrentHashMap------------------浅谈!!
    spring ioc容器和spring mvc 容器--------浅谈!!
    针对xml文件做提取与写入的操作
    vim编辑器显示行号
    ubuntu双系统修复windows引导
    git基本操作
  • 原文地址:https://www.cnblogs.com/yhdsir/p/5536572.html
Copyright © 2011-2022 走看看