您的位置:

解决方案:django IntegrityError("The row in table '%s' with primary key '%s' has an ""invalid foreign key: %s.%s contains a value '%s' that ""does not have a corresponding value in %s.%s."% (table_name,bad_row[0],table_name,column_name,bad_row[1],referenced_table_name,referenced_column_name,))

  发布时间:2023-04-02 16:21:40
报错的原因这是一个Django数据库中外键约束错误。例如,如果外键指向主键表的名称为"referenced_table",则可以执行以下查询如果返回False,就需要手动删除那一条数据。Author表中的"id"字段是主键,而Book表中的"author"字段是外键。这也是默认的 on_delete 行为,不过建议在使用时要慎重,以免误删重要数据。所以选择不同的 on_delete 类型可以满足不同需求。

报错的原因

这是一个Django数据库中外键约束错误。它表明一个表中的外键列引用了另一个表中不存在的主键值。这意味着在数据库中存在一个数据错误。为了解决这个问题,您应该检查这两个表之间的数据关系,并确保数据是一致的。

如何解决

具体解决方式取决于数据库中的具体错误。但是一般来说,你可以尝试以下几种方法:

1. 确保外键列中的值在其相应的主键表中存在。

2. 删除主键表中不存在的那个值。

3. 更新外键列中的值,使其对应于主键表中的一个有效值。

4. 如果表有级联关系,考虑设置 on_delete=models.SET_NULL or on_delete=models.SET_DEFAULT

不过最好查看数据库中哪个数据出现问题 在进行修改操作

对于第1种方法,您可以使用Django提供的查询功能来验证这些值是否存在。例如,如果外键指向主键表的名称为"referenced_table",则可以执行以下查询:


    referenced_table.objects.filter(pk=bad_row[1]).exists()

如果返回False,就需要手动删除那一条数据。

对于第2种方法,您可以使用Django的数据库操作来删除主键表中不存在的值。如果外键指向主键表的名称为"referenced_table",则可以执行以下操作:


    referenced_table.objects.filter(pk=bad_row[1]).delete()

对于第3种方法, 您可以使用Django的数据库操作来更新外键列中的值。例如,如果要将外键列"column_name"更新为主键表中存在的值"new_value",则可以执行以下操作:


table_name.objects.filter(column_name=bad_row[1]).update(column_name=new_value)

第4种方法 你可以在models.py 中的ForeignKey设置 on_delete=models.SET_NULL or on_delete=models.SET_DEFAULT 这样就不会出现上面那个错误了。

这些只是一些可能的解决方案,具体解决方案取决于您的数据库中的具体问题。

使用例子

是的,这是一个示例外键关系:


from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=200)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)

在这个例子中,Author表是主键表,而Book表是外键表。Author表中的"id"字段是主键,而Book表中的"author"字段是外键。 可以看到 在Book表中的author字段有on_delete=models.SET_NULL, null=True 这样就能避免IntegrityError

如果Author表中删除了一个author,而book表里还有关于这个author的记录,那么book表里对应的author字段就会被设置为NULL。这样就能规避这个问题

需要注意的是,如果你使用 on_delete=models.CASCADE,Django将在删除主键表中的记录时级联删除外键表中的相关记录。这也是默认的 on_delete 行为,不过建议在使用时要慎重,以免误删重要数据。

另外,还有一个 on_delete=models.PROTECT 意思是不能删除被外键关联的主键表数据,如果要删除会报错。

所以选择不同的 on_delete 类型可以满足不同需求。