INSERT ... ON DUPLICATE KEY UPDATE
返回值说明
- 如果行作为新记录被插入,则受影响行的值为1;
- 如果原有的记录被更新,则受影响行的值为2
- 如果更新的数据和已有的数据一模一样,则受影响的行数是0,这意味着不会去更新,也就是说即使你有的时间戳是自动记录最后一次的更新时间,这个时间戳也不会变动。
致命缺点
- 不能在并发情况下使用,会被mysql的检查机制发现死锁,这是间隙锁(GAP)导致的
作用及语法
- 先判断一条记录是否存在,存在则
update
,否则insert
。 - 如果你插入的记录导致一个
UNIQUE索引
或者primary key(主键)
出现重复,那么就会认为该条记录存在,则执行update
语句而不是insert
语句,反之,则执行insert语句而不是更新语句。 ON DUPLICATE KEY UPDATE
是不能写where条件的- INSERT INTO tablename(field1,field2, field3, ...) VALUES(value1, value2, value3, ...) ON DUPLICATE KEY UPDATE field1=value1,field2=value2, field3=value3, ...;
示例
创建表,这里的id是主键,如果要插入的数据中id重复,就会更新数据,否则插入数据
CREATE TABLE `test` (
`id` int NOT NULL AUTO_INCREMENT,
`a` int DEFAULT NULL,
`b` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_german2_ci DEFAULT NULL,
`c` varchar(255) COLLATE utf8mb4_german2_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_german2_ci;
批量插入两条数据,第一次运行会全部插入,第二次运行会执行更新操作
INSERT INTO `test`(id,a,b,c)
VALUES
( 1,2,2,9),
( 2,3,3,10)
ON DUPLICATE KEY UPDATE
a=VALUES(a),
b=VALUES(b),
c=VALUES(c)
你要是觉得写的还不错,就点个关注,可以评论区留下足迹,以后方便查看.
你要是觉得写的很辣鸡,评论区欢迎来对线!
欢迎转载!