IntegrityError:重复键值违反唯一约束

Posted

技术标签:

【中文标题】IntegrityError:重复键值违反唯一约束【英文标题】:IntegrityError: duplicate key value violates unique constraint 【发布时间】:2020-03-27 00:24:47 【问题描述】:

我在 django 应用程序中创建了一个模型,并将数据从 pgadmin 填充到表中,但现在当我尝试从应用程序创建记录时,它会引发此完整性错误:

重复键值违反唯一约束“packsapp_foo_pkey”

详细信息:键 (id)=(4) 已存在。

这是models.py

class foo(models.Model):
    a = models.CharField(max_length=500, default=0)
    b = models.EmailField(max_length=500, default=0)
    c = models.CharField(max_length=500, default=0)
    d = models.CharField(max_length=500, default=0)

我是否总是需要从应用程序本身插入数据?

Views.py

class ProductFormView(CreateView):
    model = Product
    form_class = Productaddform

    template_name = 'packsapp/employee/employeeProductForm.html'

    def form_valid (self, form):
        product = form.save(commit=False)
        print("user ", self.request.user.id)
        product.product_owner = Employee.objects.filter(user = self.request.user.id)[0]
        product.save()
        messages.success(self.request, 'The product was created with success! ')
        return redirect('employee:products_table')

【问题讨论】:

似乎您在插入新数据时正在传递 pk。请出示您的插入代码 请同时分享您的迁移文件 @cwhisperer 不,我没有通过 pk,我的表单类只包含 a,b,c,d @UsmanMaqbool 我错误地删除了迁移,不再拥有它们 看起来您的数据库 pk 序列不同步。如果您强制使用自动主键的值,就会发生这种情况。我不记得究竟是如何在 postgres 中处理序列的,但无论如何它都有记录。 【参考方案1】:

同意 bruno 的评论,即您的主键序列不同步。要解决此问题,请在 PG 控制台中运行以下命令:

SELECT setval(pg_get_serial_sequence('packsapp_foo', 'id'), max("id")) FROM "packsapp_foo";

要在数据库中手动输入值,请确保在插入时为 id 调用 nextval(<sequence>) - 这将保持 pk 序列同步,例如:

INSERT INTO packsapp_foo
  (id, a, b, c, d)
VALUES
  (next_val(pg_get_serial_sequence('packsapp_foo', 'id')), ...);

这同样适用于您在表格列上可能拥有的任何其他序列。更新序列见Postgres Docs

【讨论】:

以上是关于IntegrityError:重复键值违反唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

Postrgersql+Django:NULL值导致IntegrityError:重复键值违反唯一约束

django.db.utils.IntegrityError:重复键值违反唯一约束“auth_permission_pkey”

django.db.utils.IntegrityError:重复键值违反唯一约束“django_content_type_pkey”

重复的键值违反了唯一约束,CakePHP

Golang:重复键值违反唯一约束

TypeORM - 重复键值违反唯一约束(可延迟 fk)