• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    mysql批量更新多条记录的同一个字段为不同值的方法

    首先mysql更新数据的某个字段,一般这样写:

    UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

    也可以这样用in指定要更新的记录:

    UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

    这里注意 ‘other_values' 是一个逗号(,)分隔的字符串,如:1,2,3

    如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:

    foreach ($values as $id => $myvalue) {
     $sql = "UPDATE mytable SET myfield = $myvalue WHERE id = $id";
     mysql_query($sql);
    }

    即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

    那么能不能一条sql语句实现批量更新呢?

    mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。

    UPDATE mytable
     SET myfield = CASE id
     WHEN 1 THEN 'myvalue1'
     WHEN 2 THEN 'myvalue2'
     WHEN 3 THEN 'myvalue3'
     END
    WHERE other_field ('other_values')

    如果where条件查询出记录的id不在CASE范围内,myfield将被设置为空。

    如果更新多个值的话,只需要稍加修改:

    UPDATE mytable
     SET myfield1 = CASE id
     WHEN 1 THEN 'myvalue11'
     WHEN 2 THEN 'myvalue12'
     WHEN 3 THEN 'myvalue13'
     END,
     myfield2 = CASE id
     WHEN 1 THEN 'myvalue21'
     WHEN 2 THEN 'myvalue22'
     WHEN 3 THEN 'myvalue23'
     END
    WHERE id IN (1,2,3)

    这里以php为例,构造这两条mysql语句:

    1、更新多条单个字段为不同值, mysql模式

    $ids_values = array(
     1 => 11,
     2 => 22,
     3 => 33,
     4 => 44,
     5 => 55,
     6 => 66,
     7 => 77,
     8 => 88,
    );
     
    $ids = implode(',', array_keys($ids_values ));
    $sql = "UPDATE mytable SET myfield = CASE id ";
    foreach ($ids_values as $id=> $myvalue) {
     $sql .= sprintf("WHEN %d THEN %d ", $id, $myvalue);
    }
    $sql .= "END WHERE id IN ($ids)";
    echo $sql.";br/>";

    输出:

    UPDATE mytable SET myfield = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 WHEN 6 THEN 66 WHEN 7 THEN 77 WHEN 8 THEN 88 END WHERE id IN (1,2,3,4,5,6,7,8);

    2、更新多个字段为不同值, PDO模式

    $data = array(array('id' => 1, 'myfield1val' => 11, 'myfield2val' => 111), array('id' => 2, 'myfield1val' => 22, 'myfield2val' => 222));
    $where_in_ids = implode(',', array_map(function($v) {return ":id_" . $v['id'];}, $data));
    $update_sql = 'UPDATE mytable SET';
    $params = array();
    
    $update_sql .= ' myfield1 = CASE id';
    foreach($data as $key => $item) {
     $update_sql .= " WHEN :id_" . $key . " THEN :myfield1val_" . $key . " ";
     $params[":id_" . $key] = $item['id'];
     $params[":myfield1val_" . $key] = $item['myfield1val'];
    }
    $update_sql .= " END";
    
    $update_sql .= ',myfield2 = CASE id';
    foreach($data as $key => $item) {
     $update_sql .= " WHEN :id_" . $key . " THEN :myfield2val_" . $key . " ";
     $params[":id_" . $key] = $item['id'];
     $params[":myfield1va2_" . $key] = $item['myfield2val'];
    }
    $update_sql .= " END";
    
    $update_sql .= " WHERE id IN (" . $where_in_ids . ")";
    echo $update_sql.";br/>";
    var_dump($params);

    输出:

    UPDATE mytable SET myfield1 = CASE id WHEN :id_0 THEN :myfield1val_0 WHEN :id_1 THEN :myfield1val_1 END,myfield2 = CASE id WHEN :id_0 THEN :myfield2val_0 WHEN :id_1 THEN :myfield2val_1 END WHERE id IN (:id_1,:id_2);
    
    array (size=6)
     ':id_0' => int 1
     ':myfield1val_0' => int 11
     ':id_1' => int 2
     ':myfield1val_1' => int 22
     ':myfield1va2_0' => int 111
     ':myfield1va2_1' => int 222

    另外三种批量更新方式

    1. replace into 批量更新

    replace into mytable(id, myfield) values (1,'value1'),(2,'value2'),(3,'value3');

    2. insert into ...on duplicate key update批量更新

    insert into mytable(id, myfield1, myfield2) values (1,'value11','value21'),(2,'value12','value22'),(3,'value13','value23') on duplicate key update myfield1=values(myfield2),values(myfield2)+values(id);

    3. 临时表

    DROP TABLE IF EXISTS `tmptable`;
    create temporary table tmptable(id int(4) primary key,myfield varchar(50));
    insert into tmptable values (1,'value1'),(2,'value2'),(3,'value3');
    update mytable, tmptable set mytable.myfield = tmptable.myfield where mytable.id = tmptable.id;
    1. 【replace into】和【insert into】更新都依赖于主键或唯一值,并都可能造成新增记录的操作的结构隐患
    2. 【replace into】操作本质是对重复记录先delete然后insert,如果更新的字段不全缺失的字段将被设置成缺省值
    3. 【insert into】则只是update重复的记录,更改的字段只能依循公式值
    4. 【临时表】方式需要用户有temporary 表的create 权限
    5.  数量较少时【replace into】和【insert into】性能最好,数量大时【临时表】最好,【CASE】则具有通用型也不具结构隐患

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

    您可能感兴趣的文章:
    • MySQL根据某一个或者多个字段查找重复数据的sql语句
    • mysql查询表里的重复数据方法
    • 在SQL中对同一个字段不同值,进行数据统计操作
    上一篇:Windows下MySQL 5.7无法启动的解决方法
    下一篇:在Linux环境下mysql的root密码忘记解决方法(三种)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    mysql批量更新多条记录的同一个字段为不同值的方法 mysql,批量,更新,多条,记录,