完整性错误:更新或删除违反外键约束。 Django + PostgreSQL

Posted

技术标签:

【中文标题】完整性错误:更新或删除违反外键约束。 Django + PostgreSQL【英文标题】:Integrity error: update or delete violates foreign key constraint. Django + PostgreSQL 【发布时间】:2017-01-16 16:45:04 【问题描述】:

这是我的 UserProfile 修改

 class UserProfile(models.Model):
        user = models.OneToOneField(User)
        fb_id = models.IntegerField(primary_key=True,null=False,blank=True)
        follows = models.ManyToManyField('self', related_name='followed_by', symmetrical=False)
    User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

在尝试删除所有测试用户或其中任何一个用户后,我收到以下错误。

    django.db.utils.IntegrityError: update or delete on table "blog_userprofile" violates foreign key constraint "blog_from_userprofile_id_a482ff43f3cdedf_fk_blog_userprofile_id" on table "blog_userprofile_follows"
DETAIL:  Key (id)=(4) is still referenced from table "blog_userprofile_follows".

级联删除默认为真,为什么我会收到这个,我该如何解决?我正在使用 PostgreSQL + Django 1.8

编辑:小前提条件:我已将 primary_key 从默认更改为 fb_id。并且有重复,因为它没有被设置为唯一的。因此,当我尝试 migrate/makemigrations/syncdb 时会引发此错误:

   django.db.utils.IntegrityError: could not create unique index "blog_userprofile_fb_id_ce4e6e3086081d4_uniq"
DETAIL:  Key (fb_id)=(0) is duplicated.

这就是我尝试删除所有测试用户的原因

当我尝试重置所有内容时,我尝试恢复默认主键,我收到:

django.db.utils.ProgrammingError: multiple default values specified for column "id" of table "blog_userprofile"

【问题讨论】:

您为什么使用该物业?只需给OneToOneField 一个related_name @schwobaseggl 它被 ForeignKey 引用,但只有默认值(没有选项) @schwobaseggl 为什么?跟随错误的教程,可能没有认真阅读文档 我确实看到它会创建配置文件,如果不存在并且不会引发异常,但正如 Python 的 ZEN 所说:“显式优于隐式”;-) 这看起来好像自动创建的中间模型上的“来自”ForeignKeyon_delete=models.PROTECT,这很奇怪,因为自动创建的模型上的这些字段是硬编码的 CASCADE。你确定你的模型和你的数据库是同步的吗? 【参考方案1】:

经过多次测试,我发现我的约束没有指定 Deferrable 和 Deferred 选项,因为我当前的 DB PostgreSQL 是从 mysql 迁移的。然后我在 DB 上手动分配了这个选项并开始工作。

有关此选项的更多信息,请访问以下链接: Deferrable check constraint in PostgreSQL

我希望这会有所帮助。

【讨论】:

【参考方案2】:

如果您之前使用 Mysql 数据库并更改为 Postgres,您可能会遇到此问题。 您需要删除所有应用程序中的迁移文件夹,然后执行新的“makemigrations”和“迁移”以使用 postgres 重新启动数据库 为我工作!

【讨论】:

以上是关于完整性错误:更新或删除违反外键约束。 Django + PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

Laravel 6:违反完整性约束:1452无法添加或更新子行:外键约束失败

IntegrityError 在表“orders_order”上插入或更新违反外键约束“

错误:删除表违反外键约束。密钥 id 仍然从表中引用(很多)

SQLSTATE [23000]:违反完整性约束:1217

Laravel 关于删除完整性约束违规:1451 无法删除或更新父行:外键约束失败