我试图在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)
型
2条答案
按热度按时间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))
显示的第二部分是相关的。
mzsu5hc02#
确保你看到的是NULL值,而不是空字符串。两个空字符串总是相等的。
如果指定
NULLS NOT DISTINCT
,PostgreSQL会将两个NULL值视为非独立值,因此会得到一个错误。如果希望NULL是不同的,也就是说,如果希望在唯一列中存在多个NULL值,请使用
NULLS DISTINCT
:字符串