Django“无法添加或更新子行:外键约束失败”

Posted

技术标签:

【中文标题】Django“无法添加或更新子行:外键约束失败”【英文标题】:Django "Cannot add or update a child row: a foreign key constraint fails" 【发布时间】:2011-09-04 22:46:09 【问题描述】:

我有一个模型 Coupon,还有一个模型 Photo 和一个 ForeignKey

class Photo(models.Model):
    coupon = models.ForeignKey(Coupon,
                               related_name='description_photos')
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='images')

我在后台设置了内联,所以现在我可以从后台将照片添加到优惠券中。

我尝试添加一个,并且上传成功,但是我得到 Django 的调试页面并显示以下错误:

IntegrityError at /admin/coupon/coupon/321/
(1452, 'Cannot add or update a child row: a foreign key constraint fails (`my_project`.`coupon_photo`, CONSTRAINT `coupon_id_refs_id_90d7f06` FOREIGN KEY (`coupon_id`) REFERENCES `coupon_coupon` (`id`))')

这是什么问题,我该如何解决?

(如果重要的话,这是一个 mysql 数据库。)

编辑:我在 Sqlite3 数据库上进行了尝试,该数据库的数据集略有不同,并且它有效,所以我当前的数据库中可能有松散的数据?如何找到并删除它?

【问题讨论】:

优惠券和照片之间有关系吗? 没有。 [添加这些字符是为了满足 ***。] 我发现南创建了一个新表作为innodb,但我所有其他表都是myisam。哈哈,下次就知道了;) 【参考方案1】:

我的一些表在 InnoDB 中,一些在 MyISAM 中...我将所有内容都更改为 MyISAM,问题就解决了。

【讨论】:

啊!!!由于这个错误,我浪费了一个小时的生命......并且因为没有尽快找到这个答案。谢谢! 这也发生在我身上!但是——我仍然不知道为什么有些是用 MyISAM 和其他 InnoDB 创建的。你知道这是怎么发生的吗? 使用SHOW CREATE TABLE mytable;检查数据库引擎。 我有同样的错误并按照你的回答我检查了我的数据库,我的所有表都在 innoDB 中,但我仍然收到此错误。这里有没有人和我一样的问题? ALTER TABLE t1 ENGINE = InnoDB;更换引擎【参考方案2】:
DATABASES = 
'default': 
    ...         
    'OPTIONS': 
         "init_command": "SET foreign_key_checks = 0;",
    ,
 

(According to the official doc) 在以前版本的 Django 中,使用 InnoDB 存储引擎时,具有前向引用(即与尚未插入数据库的行的关系)的固定装置将无法加载。这是因为 InnoDB 通过立即检查外键约束而不是将检查推迟到事务提交时才偏离 SQL 标准。此问题已在 Django 1.4 中解决。

【讨论】:

非常感谢!我遇到了这个问题,很困惑。我使用带有 INNODB 和 South 的 Django 1.5,我不想手动更改架构的东西! 这真的很奇怪。我有同样的错误,但只有在运行测试并且我使用的是 Django 1.8 时。 在 Django 1.8 上为我工作。谢谢。【参考方案3】:

为避免这种情况发生,您还可以在 settings.py 中设置 STORAGE_ENGINE

对于 django >= 1.2

DATABASES = 
    'default': 
        ...
        'STORAGE_ENGINE': 'MyISAM / INNODB / ETC'
    

对于 django

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

请注意这仅对 MySQL 有效

【讨论】:

【参考方案4】:

有时出现此错误的原因是尝试先保存子表,然后再保存父表。 解决方案是使用。

DATABASES = 
 'default': 
  ...         
 'OPTIONS': 
     "init_command": "SET foreign_key_checks = 0;",
     ,
  

2)。检查您的数据库操作流程并使其成为parent ---> child

【讨论】:

如何使它成为父 ---> 子【参考方案5】:

我遇到了同样的问题:mmrs151 的解决方案有效,但注意,对于 Django <= 1.2ie 在多数据库支持之前),设置如下所示:

DATABASE_OPTIONS = "init_command": "SET foreign_key_checks = 0;"

值得注意的是,Ram Rachum 似乎解决了问题,而不是解决了问题:MyISAM 根本不支持事务...

【讨论】:

【参考方案6】:

另一种选择是删除 MySQL 表中的约束:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;

【讨论】:

以上是关于Django“无法添加或更新子行:外键约束失败”的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:无法添加或更新子行:外键约束失败

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

无法添加或更新子行:外键约束失败

外键 Laravel 8 foreignId + 约束 - 无法添加或更新子行:外键约束失败

无法添加或更新子行:外键约束失败

C# - 无法添加或更新子行:外键约束失败