INSERT ... ON DUPLICATE KEY UPDATE Statement
On Key update ... INSERT Duplicate Statement
2023-06-13 09:11:17 时间
我们在使用INSERT
语句时,有时会有这样的需求,不存在就新增,存在就更新
此时我们可以使用INSERT ... ON DUPLICATE KEY UPDATE
语句
就像mysql
官方文档中提到的那样,我们如果将a
列设为UNIQUE
唯一索引或者主键时,并且当前表已经存在了a=1
的数据,对于这种情况,下面两条sql
的结果是相等的
当然如果不满足上方条件,则会新增一条数据
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;
对于InnoDB
引擎的表,此处的新增可能会触发自增列,但修改操作不会触发
如果上方的唯一索引再加一个b
列,则上方第一条sql
和下方sql
结果相等
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
注意如果此处a=1 or b=2
匹配多行,则只会更新一行,所以我们需要避免在有多个唯一索引的表上使用本语法
我们在表内没有满足条件的数据时执行该sql
,返回影响行数为1
我们再次执行
可以看到影响行数为2
这说明新增操作返回1
,修改操作返回2
但如果我们修改的值没有变化,则为0
,例如:
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c,b=b;
如果使用 mysql_real_connect()
来连接mysql
,修改的值没有变化时,还是返回1
并且如果我们触发了自增,也可以使用 LAST_INSERT_ID()
函数获取自增后的值
我们还可以在ON DUPLICATE KEY UPDATE
后方使用VALUES
函数来获取上方INSERT
语句中某列的值例如
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
上面的sql
和下面这条sql
执行结果也是相同的
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=3;
INSERT INTO t1 (a,b,c) VALUES (4,5,6)
ON DUPLICATE KEY UPDATE c=9;
从 MySQL 8.0.20开始,不推荐使用 VALUES ()来引用新的行和列,并且在将来的 MySQL 版本中可能会删除。相反,应该使用行和列别名
Mysql8.0.19
之后,我们可以给表和列取别名,例如:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS table1
ON DUPLICATE KEY UPDATE c = table1.a+table1.b;
以及
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS table1(m,n,p)
ON DUPLICATE KEY UPDATE c = m+n;
就先写这么多吧
相关文章
- Voice ID On-device - Embedded Secure Authentication Solution
- PostGreSQL ON DUPLICATE KEY UPDATE
- Serverless时代已经全面到来:冷启动时间降低90%,数据分析All on Serverless
- ORA-22872: OID INDEX clause not allowed on tables with primary key based object identifiers ORACLE 报错 故障修复 远程处理
- ORA-23453: requested operation is not supported on top flavor ORACLE 报错 故障修复 远程处理
- ORA-25290: Cannot complete operation on queue string with existing messages ORACLE 报错 故障修复 远程处理
- ORA-27060: could not set close-on-exec bit on file ORACLE 报错 故障修复 远程处理
- ORA-54535: incorrect box surface because it is on arbitrary plane ORACLE 报错 故障修复 远程处理
- ORA-55505: DDL done on an interesting object after mining start SCN ORACLE 报错 故障修复 远程处理
- ORA-09889: osnTXtt: access error on oracle executable ORACLE 报错 故障修复 远程处理
- ORA-12031: cannot use primary key columns from materialized view log on “string”.”string” ORACLE 报错 故障修复 远程处理
- MySQL中on duplicate key update的使用方法实例
- mysql replace into和on duplicate key update用法详解数据库
- Oracle 参数 ENABLED_PDBS_ON_STANDBY 官方解释,作用,如何配置最优化建议
- 利用Redis统计特定Key的使用情况(redis统计特定key)
- 利用Redis进行Key槽优化的技巧(获取redis的key槽)
- 查看Redis中的Key一种有效的数据管理方式(查看Redis的 key)
- 一键删除,轻松清理Redis中的Key(删除redis中的key)
- 使用Redis实现自增Key的操作(redis设置自增key)