我们在开发中,会经常在离线任务或者一次性导数据操作时,对 MySQL 表做插入数据记录时,如果对应的唯一键存在,就做更新数据操作或者忽略此次添加数据动作。
插入数据,存在(表明唯一键冲突)则更新
INSERT INTO table (id, name, age) VALUES
(1, "B", 29)
ON DUPLICATE KEY UPDATE
name="B",
age=29
当插入数据至 table 表的主键字段(也是唯一键)id 值冲突时,执行 ON DUPLICATE KEY 后面的 UPDATE 操作。
如果批量操作,可以如下:
INSERT INTO table (a, b, c) VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9),
ON DUPLICATE KEY UPDATE
a = VALUES(a),
b = VALUES(b),
c = VALUES(c)
此外,还需要了解的是,如果最终是插入操作,受影响行的值为 1;如果是更新操作,受到影响行的值为 2;如果更新的数据和已有的数据一样(就相当于没变,所有值保持不变),受到影响的行的值为 0。
还有另一种方式
replace into操作,该方法本质上是先操作delete操作,然后再执行insert操作,如果插入的表除了自增主键,还有唯一键时,该方法执行后主键 id 会变化,这一点需要了解。
插入数据,存在(表明唯一键冲突)则忽略
INSERT IGNORE INTO table (id, name, age) VALUES
(1, "B", 29)
在正常的 INSERT 语句中增加了 IGNORE 关键字,当主键 primary index 或唯一索引(unique index)冲突时,忽略此次插入操作。