INSERT INTO ... ON DUPLICATE KEY UPDATE
是 MySQL 中的一个非常有用的语句,它允许你尝试向表中插入一行数据,如果由于主键或唯一约束的存在导致这一行与表中已有的行发生冲突(即重复),则更新该行而不是插入新行。这对于需要“如果存在则更新,否则插入”逻辑的场景非常有用。
基本语法
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
ON DUPLICATE KEY UPDATE
column1 = value1,
column2 = value2,
...;
示例
假设有一个名为 employees
的表,包含 id
(主键)、name
和 salary
三个字段。
- 插入新记录:
如果表中没有 id = 1
的记录,下面的语句会插入一条新记录。
INSERT INTO employees (id, name, salary)
VALUES (1, 'John Doe', 50000)
ON DUPLICATE KEY UPDATE
salary = 50000;
如果 id = 1
的记录已存在,由于 ON DUPLICATE KEY UPDATE
子句的存在,这条语句实际上不会做任何事情(因为 salary
的值没有改变)。
- 更新现有记录:
如果表中已存在 id = 1
的记录,下面的语句会更新该记录的 salary
字段。
INSERT INTO employees (id, name, salary)
VALUES (1, 'John Doe', 60000)
ON DUPLICATE KEY UPDATE
salary = VALUES(salary);
这里使用了 VALUES(salary)
,它代表 INSERT
语句中 salary
字段的值(即 60000)。这样,如果 id = 1
的记录已存在,它的 salary
字段会被更新为 60000。
注意点
- 确保表有合适的主键或唯一索引,这样 MySQL 才能判断何时触发
ON DUPLICATE KEY UPDATE
。 - 可以使用
VALUES(column_name)
来引用INSERT
语句中指定的值,或者使用表中现有的值(直接引用列名)。 ON DUPLICATE KEY UPDATE
也可以用于处理多列的情况,只需在UPDATE
部分列出所有需要更新的列和它们的值。- 如果在
ON DUPLICATE KEY UPDATE
子句中更新的列使用了复杂的表达式或函数调用,确保这些表达式或函数调用的结果是你所期望的。 - 考虑到性能和事务完整性的要求,可能需要考虑使用其他方法来处理并发更新,尤其是在高并发的环境下。