唯一索引批量插入导致报错-ON DUPLICATE KEY UPDATE和 insert ignore

61 阅读2分钟

在代码里面处理比较麻烦,需要先查一遍数据库里已有的数据(如果表数据量比较大查询也费时),将原需要批量插入数据减去库里已有的数据,再做批量插入 正确处理:使用** 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呢?