无法创建唯一索引,键重复 django postgres

Posted

技术标签:

【中文标题】无法创建唯一索引,键重复 django postgres【英文标题】:could not create unique index, key is duplicated django postgres 【发布时间】:2021-06-22 02:56:52 【问题描述】:

我得到了具有相同 uuid 的以下用户表。我希望这个 uuid 是独一无二的。但是在使用 unique=True 和 editable=False 从我的用户模型中更改 uuid 时 在执行迁移命令时,我收到“psycopg2.errors.UniqueViolation: could not create unique index”错误,其中 Key (hnid)=(8c0bc4a2-165a-47d5-8084-8b87600c7fe8) is duplicated。

我的模型.py

hnid = models.UUIDField("HNID", default=uuid.uuid4, blank=True, null=True, unique=True,editable=False)

注意:我使用的是 postgres 我该如何解决这个问题

【问题讨论】:

您必须先更改重复​​值或删除这些条目。 我该怎么做?对不起,我是新手 请将您的模型添加到问题中。 【参考方案1】:

请注意您对 hnid 的定义。可以直接使用primary_key=True

hnid = models.UUIDField(
        primary_key=True,
        default=uuid_lib.uuid4,
        editable=False,
    )

primary_key=True 暗示 null=Falseunique=True 并且是只读的。根据文档,对象上只允许有一个主键。 blank=True 不是一个好主意:你不想在你的对象上有一个空白的主键。另外,它不适用于unique=True

关于迁移,Django 在他们的文档中给出了一个很好的例子:https://docs.djangoproject.com/en/3.1/howto/writing-migrations/#migrations-that-add-unique-fields 而且效果很好!

【讨论】:

以上是关于无法创建唯一索引,键重复 django postgres的主要内容,如果未能解决你的问题,请参考以下文章

mysql “索引”能重复吗?“唯一索引”与“索引”区别是啥?

SQL有三个类型的索引,唯一索引 不能有重复,但聚集索引,非聚集索引可以有重复

mysql 主键索引和唯一索引的区别

唯一索引与主键索引的比较

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引

oracle 数据库中主键索引和唯一索引有啥区别