MySQL中的批量更新实战

MySQL中的批量更新实战

表结构

mysql> desc dept;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| deptno | int(11)     | NO   | PRI | NULL    | auto_increment |
| dname  | varchar(10) | YES  |     | NULL    |                |
| loc    | varchar(50) | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.27 sec)

原始数据

mysql> select * from dept;
+--------+--------+------+
| deptno | dname  | loc  |
+--------+--------+------+
|      1 | 开发部 | 北京 |
|      2 | 测试部 | 上海 |
|      3 | 市场部 | 广州 |
|      4 | 运营部 | 杭州 |
+--------+--------+------+
4 rows in set (0.06 sec)

方法1:replace into

流程

  1. 尝试将新行插入表中
  2. 如果插入时报冲突(主键或者唯一键),则删除冲突的老数据
  3. 将新数据插入表中

实战

mysql> REPLACE into dept (deptno,dname) values (1,'开发'),(2,'测试');
Query OK, 4 rows affected (0.08 sec)
Records: 2  Duplicates: 2  Warnings: 0

从4 rows affected这里我们可以看出原来的2行被删除了,新的2行比插入了,总共影响了4行数据

mysql> select * from dept;
+--------+--------+------+
| deptno | dname  | loc  |
+--------+--------+------+
|      1 | 开发   | NULL |
|      2 | 测试   | NULL |
|      3 | 市场部 | 广州 |
|      4 | 运营部 | 杭州 |
+--------+--------+------+
4 rows in set (0.06 sec)

注意

replace into语义与insert into类似,都是往表中插入数据,如果没有列没有指定则按照默认值处理,在使用replace into做批量更新时一定要注意,要全字段更新

方法2:insert into [table] values… on duplicate key update

mysql> insert into dept (deptno,dname) values(3,'市场'),(4,'运营') on duplicate key update dname = values(dname);
Query OK, 4 rows affected (0.23 sec)
Records: 2  Duplicates: 2  Warnings: 0
mysql> select * from dept;
+--------+-------+------+
| deptno | dname | loc  |
+--------+-------+------+
|      1 | 开发  | NULL |
|      2 | 测试  | NULL |
|      3 | 市场  | 广州 |
|      4 | 运营  | 杭州 |
+--------+-------+------+
4 rows in set (0.08 sec)

流程

  1. 尝试往表中插入数据
  2. 如果冲突就更新指定的列

细节

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

如果只有a列是唯一的,数据库中存在a=1的行,则该条sql语句相当于

UPDATE table SET c=c+1 WHERE a=1;

如果a列和b列都是唯一的,且表里存在a = 1的行和b=2的行,则该sql相当于

UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

表中有多个字段唯一时,用insert into [table] values… on duplicate key update就要留意

方法4:MySQL自带批量更新语句

mysql> update dept set 
dname = case when deptno = 1 then '开发部' else dname end,
loc = case when deptno = 1 then '北京' else loc end,
dname = case when deptno = 2 then '测试部' else dname end,
loc = case when deptno = 2 then '上海' else loc end
where deptno in(1,2);
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2  Changed: 2  Warnings: 0

说明

  1. 从数据库中筛选出deptno = 1和deptno = 2的数据
  2. 当deptno = 1时将dname改为开发部否则还用原先的dname,deptno = 1时将loc改为北京,否则用原先的loc,deptno=2时同理
mysql> select * from dept;
+--------+--------+------+
| deptno | dname  | loc  |
+--------+--------+------+
|      1 | 开发部 | 北京 |
|      2 | 测试部 | 上海 |
|      3 | 市场   | 广州 |
|      4 | 运营   | 杭州 |
+--------+--------+------+
4 rows in set (0.10 sec)

相关推荐

  1. MySQL批量更新实战

    2024-05-11 11:56:03       30 阅读
  2. SpringBoot六种批量更新Mysql 方式效率对比

    2024-05-11 11:56:03       30 阅读
  3. mybatis 实现批量更新三种方式

    2024-05-11 11:56:03       49 阅读
  4. Mysql批量更新: on duplicate key update

    2024-05-11 11:56:03       45 阅读
  5. MySQL一条更新语句是怎么执行?

    2024-05-11 11:56:03       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 11:56:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 11:56:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 11:56:03       87 阅读
  4. Python语言-面向对象

    2024-05-11 11:56:03       96 阅读

热门阅读

  1. 低代码技术赋能未来乡村建设:创新与实践

    2024-05-11 11:56:03       33 阅读
  2. IT界常说的六大名言

    2024-05-11 11:56:03       29 阅读
  3. SERVER_DOWN 表示该服务器已经宕机或无法访问

    2024-05-11 11:56:03       32 阅读
  4. 代码随想录学习Day 35

    2024-05-11 11:56:03       36 阅读
  5. C语言:初学者和专家的分水岭

    2024-05-11 11:56:03       27 阅读
  6. 设计模式——访问者模式(Visitor)

    2024-05-11 11:56:03       32 阅读