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

时间:2011-05-30 16:47:41

标签: mysql django orm foreign-keys

我有一个模型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数据库上尝试过它,它运行起来,所以我当前的数据库中可能有松散的数据?如何找到并删除它?

6 个答案:

答案 0 :(得分:86)

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

答案 1 :(得分:67)

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

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

答案 2 :(得分:19)

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

表示django> = 1.2

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

表示django< = 1.2

DATABASE_STORAGE_ENGINE = "MyISAM / INNODB / ETC"

请注意,这仅适用于MySQL

答案 3 :(得分:4)

我遇到了同样的问题:mmrs151的解决方案有效,但是 NB ,对于Django <= 1.2 ie ,在多个数据库支持之前),设置看起来像这样:

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

值得注意的是Ram Rachum似乎已经解决了问题而不是解决问题:MyISAM根本不支持交易......

答案 4 :(得分:3)

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

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

2)。检查数据库操作流并将其设为parent ---> child

答案 5 :(得分:-3)

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

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