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

问题描述 投票:0回答:2

我正在尝试向 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)
postgresql null unique-constraint
2个回答
0
投票

如果您指定

NULLS NOT DISTINCT
,PostgreSQL 将两个 NULL 值视为不不同,因此您将收到错误。

如果您希望 NULL 不同,也就是说,如果您希望唯一列中存在多个 NULL 值,请使用

NULLS DISTINCT
:

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

0
投票

错误消息实际上报告了空字符串的冲突,即两个或多个

''
实例 - 与
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))

显示的第二部分是相关的。

© www.soinside.com 2019 - 2024. All rights reserved.