insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢?
在 MySQL 中,可采用INSERT INTO ... ON DUPLICATE KEY UPDATE语句实现 insertOrUpdate 功能。
值得留意的是,在出现重复键时,会在先前索引值和当前值之间添加临时键锁,这可能导致死锁。
若要使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句,需满足以下条件:
- 表必须具有主键或唯一索引;
- 插入的数据必须包含主键或唯一索引列;
- 主键或唯一索引列的值不能为 NULL。
举个例子:
设想有一张 student 表,包括 id、name 和 age 三列,其中 id 是主键。现在要插入一条数据,若该数据的主键已存在,则更新该数据的姓名和年龄,否则插入该数据。
INSERT INTO student (id, name, age) VALUES (1, 'Paidaxing', 20)
ON DUPLICATE KEY UPDATE name='Paidaxing', age=18;
底层实现
使用INSERT INTO ... ON DUPLICATE KEY UPDATE语句,如果数据库中已存在具有相同唯一索引或主键的记录,则更新该记录。其底层原理和执行流程如下:
- 检查唯一索引或主键:执行INSERT INTO ... ON DUPLICATE KEY UPDATE语句时,数据库首先尝试插入新行。在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。
- 冲突处理:如果不存在冲突的唯一索引或主键,新行将被正常插入。如果存在冲突,即发现重复的唯一索引或主键值,数据库将不会插入新行,而是转而执行更新操作。
- 执行更新:在检测到唯一索引或主键的冲突后,数据库将根据ON DUPLICATE KEY UPDATE后面指定的列和值来更新