REPLACE INTO
和 INSERT INTO ... ON DUPLICATE KEY UPDATE
都是 MySQL 中用来插入数据的语句,但它们的行为有一些不同。
1. REPLACE INTO
REPLACE INTO
是一种特殊的插入语句,它会首先检查表中是否已经存在相同的主键或唯一索引。如果存在,它会先删除旧的记录,然后插入新的记录;如果不存在,则直接插入新记录。
- 行为: 删除已存在的记录,然后插入新记录(如果主键或唯一索引重复)。
- 注意: 这个操作会先删除记录,再插入,可能会影响表中与该记录相关的其他数据(比如外键约束)。
示例:
sqlCopy Code
REPLACE INTO table_name (id, name, age)
VALUES (1, 'John', 25);
如果 id
为 1 的记录已经存在,MySQL 会删除原记录并插入新的记录。如果不存在 id=1
,则直接插入新的记录。
2. INSERT INTO ... ON DUPLICATE KEY UPDATE
INSERT INTO ... ON DUPLICATE KEY UPDATE
语句会尝试插入新记录。如果插入时发现主键或唯一索引冲突,它不会删除已有的记录,而是执行 UPDATE
操作来更新现有记录。
- 行为: 如果遇到重复的主键或唯一索引,会执行
UPDATE
,更新指定字段的值。 - 注意: 这种方式不会删除记录,只会更新冲突记录。
示例:
sqlCopy Code
INSERT INTO table_name (id, name, age)
VALUES (1, 'John', 25)
ON DUPLICATE KEY UPDATE name = 'John', age = 25;
INSERT INTO users (id, name, age)
VALUES (3, 'test', 22)
ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age);
如果 id
为 1 的记录已存在,name
和 age
字段将会被更新。如果不存在 id=1
,则直接插入新的记录。
主要区别
REPLACE INTO
会删除现有的记录并插入新记录。INSERT INTO ... ON DUPLICATE KEY UPDATE
会保留现有记录,只更新冲突的字段。
选择哪个语句取决于你的需求,如果你希望完全替换已有记录,可以选择 REPLACE INTO
;如果你只是想在冲突时更新某些字段,可以选择 INSERT INTO ... ON DUPLICATE KEY UPDATE
。