mysql-on duplicate key update实现insertOrUpdate官方文档
【README】
mysql 基于 on duplicate key update filed=value ; 实现有则更新,没有则插入;
以下内容总结于 https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
【1】api 描述
如果指定 ON DUPLICATE KEY UPDATE 子句并且要插入的行会导致 UNIQUE 索引或 PRIMARY KEY 中出现重复值,则会发生旧行的 UPDATE。 例如,如果列 a 声明为 UNIQUE 并包含值 1,则以下两个语句具有类似的效果:
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;
效果并不完全相同:对于 a 是自增列的 InnoDB 表,INSERT 语句增加自增值,但 UPDATE 不会。如果列 b 也是唯一的,则 INSERT 等效于此 UPDATE 语句:
UPDATE t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
也就说, 表t1 要有唯一键,才能保证实现新增或更新的效果; 因为主键肯定不一样;
注意:如果 a=1 OR b=2 匹配多行,则只更新一行。 通常,您应该尽量避免在具有多个唯一索引的表上使用 ON DUPLICATE KEY UPDATE 子句。
【1.1】更新行数
使用 ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为 1,如果更新现有行,则为 2,如果现有行设置为其当前值,则为 0。 如果在连接到 mysqld 时为 mysql_real_connect() C API 函数指定 CLIENT_FOUND_ROWS 标志,则如果现有行设置为其当前值,则受影响的行值为 1(而不是 0)。
【1.2】可以更新多个列
ON DUPLICATE KEY UPDATE 子句可以包含多个列分配,以逗号分隔。
INSERT INTO t1 (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=c+1, c2=2, c3=3;
【1.3】 values() 函数引用值
可以使用 VALUES(col_name) 函数来引用来自 INSERT ... ON DUPLICATE KEY UPDATE 语句的 INSERT 部分的列值。 换句话说,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指将插入的 col_name 的值,没有发生重复键冲突。 此函数在多行插入中特别有用。 VALUES() 函数仅在 ON DUPLICATE KEY UPDATE 子句或 INSERT 语句中有意义,否则返回 NULL。 例子:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
-- 等价于
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 版本中可能会被删除。 相反,使用行和列别名,如本节接下来的几段所述。
【1.4】为行使用别名(mysql8.0.19才可以,注意版本)
从 MySQL 8.0.19 开始,可以为行使用别名,可以选择插入一个或多个列,在 VALUES 或 SET 子句之后,并以 AS 关键字开头。 使用行别名 new,前面显示的使用 VALUES() 访问新列值的语句可以写成如下所示的形式:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS newON DUPLICATE KEY UPDATE c = new.a+new.b;-- 等价于INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)ON DUPLICATE KEY UPDATE c = m+n;
补充: 从 MySQL 8.0.20 开始,在 UPDATE 子句中使用 VALUES() 的 INSERT ... SELECT ... ON DUPLICATE KEY UPDATE 语句会抛出警告:
INSERT INTO t1SELECT c, c+d FROM t2ON DUPLICATE KEY UPDATE b = VALUES(b);-- 等价于
INSERT INTO t1SELECT * FROM (SELECT c, c+d AS e FROM t2) AS dtON DUPLICATE KEY UPDATE b = e;
【1.5】将行和列别名与 SET 子句一起使用,而不用values
在刚刚显示的两个 INSERT ... ON DUPLICATE KEY UPDATE 语句中使用 SET 而不是 VALUES 可以如下所示完成:
INSERT INTO t1 SET a=1,b=2,c=3 AS newON DUPLICATE KEY UPDATE c = new.a+new.b;INSERT INTO t1 SET a=1,b=2,c=3 AS new(m,n,p)ON DUPLICATE KEY UPDATE c = m+n;
【1.6】行别名不能与表名相同。
如果未使用列别名,或者它们与列名相同,则必须使用 ON DUPLICATE KEY UPDATE 子句中的行别名来区分它们。 列别名对于它们所应用的行别名必须是唯一的(即,没有引用同一行列的列别名可能是相同的)。
【2】insert ... select ... on duplicate key update (不建议使用,不安全,参见文末)
对于 INSERT ... SELECT 语句,这些规则适用于可以在 ON DUPLICATE KEY UPDATE 子句中引用的可接受形式的 SELECT 查询表达式:
- 对来自单个表(可能是派生表)的查询的列的引用。
- 对多个表的连接查询中的列的引用。
- 对来自 DISTINCT 查询的列的引用。
- 引用其他表中的列,只要 SELECT 不使用 GROUP BY。 一个副作用是您必须限定对非唯一列名的引用。
【2.1】不支持从 UNION 引用列。
要解决此限制,请将 UNION 重写为派生表,以便可以将其行视为单表结果集。 例如,此语句会产生错误(语法错误):
INSERT INTO t1 (a, b)SELECT c, d FROM t2UNIONSELECT e, f FROM t3
ON DUPLICATE KEY UPDATE b = b + c;
相反,使用将 UNION 重写为派生表的等效语句(语法正确):
INSERT INTO t1 (a, b)
SELECT * FROM(SELECT c, d FROM t2UNIONSELECT e, f FROM t3) AS dt
ON DUPLICATE KEY UPDATE b = b + c;
【2.2】支持group by
将查询重写为派生表的技术还支持从 GROUP BY 查询引用列。
【2.3】INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句是不安全的
因为 INSERT ... SELECT 语句的结果取决于来自 SELECT 的行的顺序,并且无法始终保证此顺序,所以在记录 INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句时源和副本可能会出现分歧 . 因此,对于基于语句的复制,INSERT ... SELECT ON DUPLICATE KEY UPDATE 语句被标记为不安全(谨慎使用 insert ... select on duplicate key update )。
此类语句在使用基于语句的模式时会在错误日志中产生警告,并在使用 MIXED 模式时使用基于行的格式写入二进制日志。 针对具有多个唯一键或主键的表的 INSERT ... ON DUPLICATE KEY UPDATE 语句也被标记为不安全。 (错误#11765650,错误#58637)
mysql-on duplicate key update实现insertOrUpdate官方文档相关推荐
- 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNI ...
- Mysql on duplicate key update用法及优缺点
在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPL ...
- mysql多个on_在多个查询中插入多行的MySQL ON DUPLICATE KEY UPDATE
我有一个SQL查询,我想在单个查询中插入多行.所以我用了类似的东西: $sql = "INSERT INTO beautiful (name, age) VALUES ('Helen', 2 ...
- mybatis中mysql ON DUPLICATE KEY UPDATE写法
2019独角兽企业重金招聘Python工程师标准>>> <insert id="batchInsertFansInfo" parameterType=&qu ...
- MySQL中 ON DUPLICATE KEY UPDATE语法的使用
MySQL ON DUPLICATE KEY UPDATE 为Mysql特有语法 ON DUPLICATE KEY UPDATE 用法与说明 Mysql中INSERT ... ON DUPLICATE ...
- 【MySQL】ON DUPLICATE KEY UPDATE 解决重复插入问题
参考文章:mysql "ON DUPLICATE KEY UPDATE" 语法 ON DUPLICATE KEY UPDATE 开发过程中,可能会遇到这样的需求,先判断某一记录是否 ...
- on duplicate key update用法及优缺点
Mysql on duplicate key update用法及优缺点 在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,一般思路是将其实现分 ...
- MYSQL中ON DUPLICATE KEY UPDATE对数据进行insertOrUpdate操作
本文来自:高爽|Coder,原文地址:[url]http://blog.csdn.net/ghsau/article/details/23557915[/url],转载请注明. 向数据库插入记录时,有 ...
- mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...
1. 背景 业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了.查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下: Thread poi ...
最新文章
- 使用GDAL将12bit量化图像转为16bit或者8bit
- 小工匠聊架构-超高并发秒杀系统设计 03_热点数据的处理
- 【转载】输出二进制 C
- Redis 学习---(12)Redis HyperLogLog
- rtorrent -- PT机的下载利器
- 程序员应知道这十大面向对象设计原则
- cornerstone图标含义
- 【Unity3D插件】Unity3D各类教程汇总
- linux 进入recovery 命令行,liunx-fastboot命令行的使用方法
- python箱形图各部分含义_箱形图以及python实践
- J - 山峰和山谷 Ridges and Valleys
- 用MPI进行分布式内存编程(二)MPI_allreduce MPI_scatt MPI_bcast.....
- windows 禁用中文输入法
- 【python逆向一把梭】pyinstaller打包的exe逆向一把梭
- Java入门教程(视频)
- 第二天 02-在VMware 安装安卓虚拟机
- Android拖动进度条画面随动,Android学习笔记(24):进度条组件ProgressBar及其子类
- OSX下代码打开系统首选项(system preferences)
- JAVA语言的优点及特性
- 天籁之声---世界上最动听的歌
热门文章
- AtCoder Regular Contest 064
- Libre OJ 「BalticOI 2013」非回文数 数位dp
- 牛客题霸 [ 最小的K个数] C++题解/答案
- CF889E-Mod Mod Mod【dp】
- CF1446F-Line Distance【计算几何,树状数组,二分】
- jzoj3237-间谍派遣【最小生成树,并查集】
- 亿些模板【字符串+其他】
- P3891-[GDOI2014]采集资源【背包,dp】
- ssl1624-小萨的烦恼【图论,最短路,Floyd】
- 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)