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


69

我有一个模型Coupon,以及模型PhotoForeignKey它:

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数据库上尝试过它,并且它起作用了,所以也许在当前的DB中有松散的数据?如何找到并删除它?


Coupon和Photo有关系吗?
Hgeg

否。[添加这些字符是为了满足StackOverflow。]
Ram Rachum 2011年

我发现south创建了一个新表innodb,但我所有其他表都是myisam。大声笑,将为下一次知道;)
rix 2014年

Answers:


86

我的某些表位于InnoDB中,而某些表位于MyISAM中...我将所有内容都更改为MyISAM,问题已解决。


3
啊!!! 由于这个错误而浪费了我一个小时的时间……而且是因为没有足够快地找到这个答案。谢谢!
webjunkie 2012年

这也发生在我身上!但是,我仍然茫然为什么使用MyISAM和其他InnoDB创建了一些。你知道这怎么可能吗?
jkeesh13年

5
使用SHOW CREATE TABLE mytable;用于检查数据库引擎。
SeppoErviälä13年

我有同样的错误,并按照您的回答检查我的数据库,我所有的表都在innoDB中,但仍然出现此错误。请问这里有人有和我一样的问题吗?
gacon 2013年

ALTER TABLE t1 ENGINE = InnoDB;更换引擎
Pierre de LESPINAY 2014年

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

根据官方文档)在早期版本的Django中,使用InnoDB存储引擎时,带有正向引用(即与尚未插入数据库的行的关系)的夹具将无法加载。这是由于InnoDB通过立即检查外键约束而不是将检查推迟到提交事务之前而偏离了SQL标准。此问题已在Django 1.4中解决。


6
非常感谢!我遇到了这个问题,感到困惑。我将Django 1.5与INNODB和South一起使用,我不想手动更改架构内容!
JREAM 2013年

这真的很奇怪。我有相同的错误,但只有在运行测试时才使用,而我使用的是Django 1.8。
Sardathrion-反对SE滥用

1
在Django 1.8上为我工作。谢谢。
蒂姆·S.

18

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

对于Django> = 1.2

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

对于Django <= 1.2

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

请注意,这仅对MySQL有效


5

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

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

值得一提的是Ram Rachum似乎可以解决问题而不是解决问题:MyISAM根本不支持交易...


4

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

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

2)。检查您的数据库操作流程并进行parent ---> child


如何使其成为父母--->孩子
Henning Lee

-4

另一个选择是将约束放置在MySQL表中:

alter table <TABLE_NAME> drop foreign key <CONTRAINT_NAME>;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.