ON DUPLICATE KEY UPDATE是MySQL特有的语法,当插入的行的主键或唯一键值与已有的行的主键或唯一键值相同时,则执行UPDATE操作。
解决方案:
- 使用INSERT INTO ... ON DUPLICATE KEY UPDATE ...语法。
 
例如,有一个表students,其中包含id和name两个字段,id是主键。
INSERT INTO students (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
如果你尝试插入一个已存在的id,例如id为1的记录,MySQL将执行更新操作:
INSERT INTO students (id, name) VALUES (1, 'Alice') ON DUPLICATE KEY UPDATE name = VALUES(name);
这将把id为1的记录的name字段更新为'Alice'。
- 使用INSERT IGNORE INTO ... ON DUPLICATE KEY UPDATE ...语法。
 
如果你想忽略重复的键,而不是更新它们,你可以使用INSERT IGNORE语法。
例如:
INSERT IGNORE INTO students (id, name) VALUES (1, 'Alice') ON DUPLICATE KEY UPDATE name = VALUES(name);
如果id为1的记录已经存在,MySQL将不执行任何操作,也不会报错。
注意:VALUES(value)函数用于获取INSERT语句中的值。
- 使用REPLACE INTO ...语法。
 
REPLACE INTO语句首先尝试插入记录,如果找到重复键,它将删除旧记录并插入新记录。
例如:
REPLACE INTO students (id, name) VALUES (1, 'Alice');
如果id为1的记录已经存在,MySQL将删除旧记录,然后插入新记录。这将导致自动增长的ID可能会跳过一些编号。
注意:REPLACE INTO语句和INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句的行为是不同的,REPLACE INTO会删除旧的记录,而ON DUPLICATE KEY UPDATE只会更新旧的记录。