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子句中更新的列使用了复杂的表达式或函数调用,确保这些表达式或函数调用的结果是你所期望的。 - 考虑到性能和事务完整性的要求,可能需要考虑使用其他方法来处理并发更新,尤其是在高并发的环境下。
2万+

被折叠的 条评论
为什么被折叠?



