我正在尝试向 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)
如果您指定
NULLS NOT DISTINCT
,PostgreSQL 将两个 NULL 值视为不不同,因此您将收到错误。
如果您希望 NULL 不同,也就是说,如果您希望唯一列中存在多个 NULL 值,请使用
NULLS DISTINCT
:
ALTER TABLE myschema.mytable ADD UNIQUE NULLS DISTINCT (personnel_id);
错误消息实际上报告了空字符串的冲突,即两个或多个
''
实例 - 与null
不同!对于冲突的空值,您会看到:
错误:密钥 (personnel_id)=(null) 重复。
但是你得到:
错误:密钥 (personnel_id)=() 重复。
您需要 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 版本的数据库集群时:
psql(16.1(Ubuntu 16.1-1.pgdg20.04+1),服务器14.10(Ubuntu 14.10-1.pgdg20.04+1))
显示的第二部分是相关的。