在代码里面处理比较麻烦,需要先查一遍数据库里已有的数据(如果表数据量比较大查询也费时),将原需要批量插入数据减去库里已有的数据,再做批量插入 正确处理:使用** ON DUPLICATE KEY UPDATE**,
- 当插入的数据导致唯一键冲突时,MySQL 不会报错,而是执行指定的更新操作。
- 允许你定义在发生冲突时如何更新现有记录。
例:如下user表有用户名,邮箱,登录时间几个字段,假如在用户名上设置了唯一键 UNIQUE KEY
uk_username(username),则使用ON DUPLICATE KEY可以只更新除唯一索引字段以外的其他字段
INSERT INTO users (username, email, signup_date)
VALUES
('john_doe', 'john@example.com', NOW()),
('alice', 'alice@example.com', NOW()),
('bob', 'bob@example.com', NOW())
ON DUPLICATE KEY UPDATE
email = VALUES(email),
signup_date = VALUES(signup_date);
缺点
- 需要明确写出每个需要更新的字段,可能增加代码量。
- 对于非常大的批量插入,可能会降低性能(因为需要检查每一行是否冲突)。
2. INSERT IGNORE
功能
-
当插入的数据导致唯一键冲突时,MySQL 忽略该错误并跳过插入这条记录。
-
如果有其他类型的错误(如数据截断),也会被忽略。
-
缺点
-
静默失败:如果有多条记录冲突,这些记录会被静默忽略,而不会有任何提示(除非查看警告日志)。
-
缺乏控制:无法对已存在的记录进行任何修改。
3.使用场景
-
使用
ON DUPLICATE KEY UPDATE:- 如果用户已经存在于数据库中,更新他们的最新信息(例如电子邮件地址)。
- 这样可以确保数据库中的信息是最新的。
-
使用
INSERT IGNORE:- 如果你只关心新用户的添加,不关心旧用户的更新。
- 这种方式更轻量级,尤其适合大数据量的批量插入。 那么我理解的目前我接触到的数据库都是对准确率有要求的吧,如果粗暴使用ignore,数据库表原本定义的not null 或者类型可能会失效。 请教家人们哪些业务场景会用到isert ignore呢?