备注:测试数据库版本为MySQL 8.0
真实环境中会有一种应用场景,如存在更新,不存在则更新,Oracle中有merge语句,可以实现此功能。
MySQL中可以用INSERT … ON DUPLICATE KEY UPDATE来实现。
Table of Contents
一.从一个简单的例子看INSERT … ON DUPLICATE KEY UPDATE
代码:
create table t1(a int, b int not null, c int not null ,primary key (a));
INSERT INTO t1 (a,b,c) VALUES (1,2,3);
复制
如果指定了ON DUPLICATE KEY UPDATE子句,而要插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则对旧行进行更新.
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;
复制
测试记录:
mysql> create table t1(a int, b int not null, c int not null ,primary key (a)); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t1 (a,b,c) VALUES (1,2,3); Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +---+---+---+ | a | b | c | +---+---+---+ | 1 | 2 | 3 | +---+---+---+ 1 row in set (0.00 sec) mysql> INSERT INTO t1 (a,b,c) VALUES (1,2,3) -> ON DUPLICATE KEY UPDATE c=c+1; Query OK, 2 rows affected (0.00 sec) mysql> select * from t1; +---+---+---+ | a | b | c | +---+---+---+ | 1 | 2 | 4 | +---+---+---+ 1 row in set (0.00 sec) mysql> UPDATE t1 SET c=c+1 WHERE a=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t1; +---+---+---+ | a | b | c | +---+---+---+ | 1 | 2 | 5 | +---+---+---+ 1 row in set (0.00 sec) mysql>
复制
二.模拟一个同事存在insert+update的例子
数据接着上例数据,模拟一个insert+update的例子。
如果不存在则insert,如果存在 c = a + b
代码:
select * from t1;
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4, 5, 6)
ON DUPLICATE KEY UPDATE c=a+b;
select * from t1;
复制
测试记录:
mysql> select * from t1;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 2 | 5 |
+---+---+---+
1 row in set (0.00 sec)
mysql>
mysql>
mysql>
mysql>
mysql> INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4, 5, 6)
-> ON DUPLICATE KEY UPDATE c=a+b;
Query OK, 3 rows affected (0.00 sec)
Records: 2 Duplicates: 1 Warnings: 0
mysql> select * from t1;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
+---+---+---+
2 rows in set (0.00 sec)
mysql>
复制
在测试一个insert into select
代码:
select * from t1; INSERT INTO t1 (a,b,c) select tmp.a,tmp.b,tmp.c from ( select a, b, c from t1 union all select 100, 101, 102 ) tmp ON DUPLICATE KEY UPDATE c=tmp.a + tmp.b; select * from t1;
复制
测试记录:
mysql> select * from t1;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 2 | 3 |
| 4 | 5 | 6 |
+---+---+---+
2 rows in set (0.00 sec)
mysql> INSERT INTO t1 (a,b,c)
-> select tmp.a,tmp.b,tmp.c from
-> (
-> select a, b, c from t1
-> union all
-> select 100, 101, 102
-> ) tmp
-> ON DUPLICATE KEY UPDATE c=tmp.a + tmp.b;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 1 Warnings: 0
mysql> select * from t1;
+-----+-----+-----+
| a | b | c |
+-----+-----+-----+
| 1 | 2 | 3 |
| 4 | 5 | 9 |
| 100 | 101 | 102 |
+-----+-----+-----+
3 rows in set (0.00 sec)
mysql>
复制
参考:
1.https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1296次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
484次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
458次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
454次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
388次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
349次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
327次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
265次阅读
2025-04-01 08:47:17
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
237次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
229次阅读
2025-03-21 15:30:53