设置联合唯一约束后仍可插入重复记录的问题咨询
联合唯一约束失效的排查方向
先确认数据库层面的约束是否真的存在且生效
别光依赖迁移记录,直接查表的创建语句:执行SHOW CREATE TABLE 你的表名;,检查输出里的UNIQUE KEY条目,确认badge_id, speech_id, badge_type这三列都被包含在同一个联合唯一约束里。另外注意NULL值的坑:MySQL中NULL不与任何值相等,包括另一个NULL。如果这三列中有允许为NULL的字段,那么包含NULL的重复行不会触发约束(比如两行(1,2,NULL)会被判定为不同)。外键关联动作修改不会导致唯一约束失效
CASCADE/DO_NOTHING是外键的ON DELETE/ON UPDATE行为,只影响关联数据的级联操作,和唯一约束的逻辑完全无关。你修改这个设置不会导致重复数据能插入,直接排除这个因素。检查Django模型与迁移的正确性
- 确认模型里的唯一约束定义正确:如果是Django 2.2+,推荐用
UniqueConstraint(而非旧的unique_together),示例代码:class YourModel(models.Model): # 字段定义... class Meta: constraints = [ models.UniqueConstraint( fields=['badge_id', 'speech_id', 'badge_type'], name='unique_badge_speech_type' ) ] - 查看迁移文件的
operations部分,确认有创建该约束的代码,并且已经通过python manage.py migrate执行完成。 - 排查插入逻辑:如果用了
bulk_create,Django默认不会触发模型校验,但数据库层面的约束应该会拦截重复数据并抛出IntegrityError。如果没报错,那大概率是数据库约束没生效。
- 确认模型里的唯一约束定义正确:如果是Django 2.2+,推荐用
其他数据库层面的可能
- 确认表的存储引擎是InnoDB(MyISAM虽然支持唯一约束,但存在一些兼容性问题)。
- 检查是否存在约束被意外删除的情况,比如之前的迁移操作错误移除了约束但你没注意到。
内容的提问来源于stack exchange,提问作者ThunderMind
相关产品推荐
相关产品推荐

