You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置联合唯一约束后仍可插入重复记录的问题咨询

联合唯一约束失效的排查方向
  • 先确认数据库层面的约束是否真的存在且生效
    别光依赖迁移记录,直接查表的创建语句:执行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。如果没报错,那大概率是数据库约束没生效。
  • 其他数据库层面的可能

    • 确认表的存储引擎是InnoDB(MyISAM虽然支持唯一约束,但存在一些兼容性问题)。
    • 检查是否存在约束被意外删除的情况,比如之前的迁移操作错误移除了约束但你没注意到。

内容的提问来源于stack exchange,提问作者ThunderMind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:45:10