我们在开发中,会经常在离线任务或者一次性导数据操作时,对 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)冲突时,忽略此次插入操作。