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)

posted @ 2021-06-08 09:41  rm-rf*  阅读(117)  评论(0编辑  收藏  举报