前言
在插入数据时,可能需要忽略或替换掉重复的数据(依据某个字段),这时可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。
以下所有实例仅针对MySQL而言,并不能随意用于其它数据库
1. 不存在则插入,存在则更新
-
on duplicate key update
如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句,例:
INSERT INTO `student`(`name`, `age`) VALUES('Jack', 19)
ON DUPLICATE KEY UPDATE `age`=19;
INSERT INTO sys_user (
username,
nickname,
password,
age,
sex,
job
) VALUES ('zhangsan','三德子','123','23','男','程序员1'),
('lisi','三德子','1234','24','男','程序员2'),
('wangwu','三德子','12345','25','男','程序员3')
ON DUPLICATE KEY UPDATE
nickname=values(nickname),
password=values(password),
age=values(age),
sex=values(sex),
job=values(job);
数据库中如果存在的数据返回的行数是2,如果不存在此条数据,则如果成功的行数为1
replace into
如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据,例:
REPLACE INTO `student`(`name`, `age`) VALUES('Jack', 18);
数据库中如果存在的数据返回的行数是2,因为它是先删除旧数据,然后再插入数据,如果不存在此条数据,则如果成功的行数为1
总结
- ON DUPLICATE KEY UPDATE跟replace into比,语法复杂点点
- ON DUPLICATE KEY UPDATE执行后主键本身不会变化,不破坏索引,性能比replace into 要高
- replace into会让主键变化,所以业务强依赖索引的就不建议用此方法
- replace into底层是先删除后插入数据,但需要重新维护索引
- 必须要有主键或唯一索引才能有效,否则replace into就只新增了
缺点
- 高并发场景,注意死锁
- 主键会变化,注意是否影响你的业务
2. 无则添加,有则跳过(避免重复插入)
ignore
关键字/句:insert ignore into,如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据,例:
INSERT IGNORE INTO `student`(`name`, `age`) VALUES('Jack', 18);