postgresql 为空列添加唯一约束返回错误

wkyowqbh  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(141)

我试图在Postgres中的一个现有表中添加一个名为personnel_id的空列上的唯一约束。大多数记录都有空personnel_id。下面是我如何做到的:

ALTER TABLE "myschema"."mytable" ADD UNIQUE NULLS not distinct ("personnel_id");

字符串
我得到这个错误:

ERROR:  could not create unique index "mytable_personnel_id_key"
DETAIL:  Key (personnel_id)=() is duplicated.


我的Postgres版本是:

psql (PostgreSQL) 15.3 (Debian 15.3-1.pgdg120+1)

mgdq6dx1

mgdq6dx11#

错误消息实际上报告了空字符串的冲突,即两个或多个''的示例-与null不同!对于冲突的null值,您将看到:
错误:Key(personnel_id)=(null)重复。
但你会得到:
错误:Key(personnel_id)=()重复。
fiddle
您需要Postgres 15或更高版本才能使用NULLS [NOT] DISTINCT功能。请参阅:

  • 使用空列创建唯一约束

还有:
psql(PostgreSQL)15.3(Debian 15.3-1.pgdg120+1)
psql不是PostgreSQL,是默认的交互式终端,不一定和Postgres版本一致,请在连接时使用SELECT version();检查您的Postgres版本。
现代版本的psql在连接时显示Postgres版本,如果不同意。
范例:
当启动psql 16.1连接到Postgres 16.1 DB时:
psql(16.1(Ubuntu 16.1-1.pgdg20.04 +1))
当连接到具有不同Postgres版本的DB集群时:
psql(16.1(Ubuntu 16.1-1.pgdg20.04 +1),server 14.10(Ubuntu 14.10-1.pgdg20.04 +1))
显示的第二部分是相关的。

mzsu5hc0

mzsu5hc02#

确保你看到的是NULL值,而不是空字符串。两个空字符串总是相等的。
如果指定NULLS NOT DISTINCT,PostgreSQL会将两个NULL值视为非独立值,因此会得到一个错误。
如果希望NULL是不同的,也就是说,如果希望在唯一列中存在多个NULL值,请使用NULLS DISTINCT

ALTER TABLE myschema.mytable ADD UNIQUE NULLS DISTINCT (personnel_id);

字符串

相关问题