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.2
(ie 在多数据库支持之前),设置如下所示:
DATABASE_OPTIONS = "init_command": "SET foreign_key_checks = 0;"
值得注意的是,Ram Rachum 似乎解决了问题,而不是解决了问题:MyISAM 根本不支持事务...
【讨论】:
【参考方案6】:另一种选择是删除 MySQL 表中的约束:
alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;
【讨论】:
以上是关于Django“无法添加或更新子行:外键约束失败”的主要内容,如果未能解决你的问题,请参考以下文章
MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败