已设置event_time与card_nr唯一约束的表为何仍能插入重复值?
唯一约束未触发冲突报错的常见原因
- 你实际插入的
event_time与card_nr组合并未真正重复:需注意字段隐式转换、不可见字符、时区差异、排序规则的影响。比如card_nr为字符串类型时,两个看起来相同的值可能存在末尾空格、不可见控制符的差异;event_time为带时区的时间类型时,插入时的时区转换会导致存储的实际值和你直观看到的不一致。 - 你创建的是两个单独的单字段唯一约束,而非
(event_time, card_nr)的联合唯一约束:单字段唯一约束只会校验单个字段的值不重复,允许两个字段的组合重复。 - 插入语句使用了冲突忽略语法:比如MySQL的
INSERT IGNORE、ON DUPLICATE KEY UPDATE,PostgreSQL的INSERT ... ON CONFLICT DO NOTHING,这类语法会自动处理唯一键冲突,不会抛出错误。 - 字段存在NULL值:绝大多数数据库的唯一约束不会判定NULL与NULL相等,只要两个字段中任意一个为NULL,哪怕另一个字段的值完全相同,也不会触发冲突报错。
- 唯一约束设置为延迟校验:部分数据库(如PostgreSQL)支持将唯一约束设置为事务延迟校验,约束检查只会在事务提交时执行,如果你在事务内插入重复值且还未提交,不会即时抛出错误。
注:以上为该场景下的所有高频触发原因,可逐一对照排查。
内容的提问来源于stack exchange,提问作者Djabone
相关产品推荐
相关产品推荐

