在 PSQL 中为可为空的列添加唯一约束

Posted

技术标签:

【中文标题】在 PSQL 中为可为空的列添加唯一约束【英文标题】:Adding a unique constraint on a nullable column in PSQL 【发布时间】:2017-12-07 04:41:50 【问题描述】:

我有一个有两列的表格。想要在两列上添加唯一约束。其中一列可以为空。

我正在尝试使用这种语法:

ALTER TABLE a ADD CONSTRAINT a_unq UNIQUE (a_id, (coalesce(a_name, '')));

"("或附近提示错误

【问题讨论】:

我很困惑,你为什么要使用合并?如果可能,请确认您使用的数据库服务器较新的 sql(2008+) 服务器允许您使用 where 子句创建唯一约束,然后可以有条件地使用。 创建部分约束(参考 - ***.com/questions/8289100/…) 【参考方案1】:

如果您确实需要解决方案,则在 PostgreSQL multiple nullable columns in unique constraint 中:只需在表上创建唯一索引,即使它不是表定义中声明的约束,它也会停止插入:

CREATE UNIQUE INDEX ex_12345 ON example
        (coalesce(FIELD1, -1)
        , coalesce(FIELD2, -1)
        , coalesce(FIELD3, -1)
        , coalesce(FIELD4, -1)
        , coalesce(FIELD5, -1)
        )
        ;

【讨论】:

【参考方案2】:

在这种情况下,您不需要使用 coalesce。只需以通常的方式创建约束:

ALTER TABLE a ADD CONSTRAINT a_unq UNIQUE (a_id, a_name);

【讨论】:

实际上他的专栏之一是可以为空的,这就是我认为他尝试使用合并的原因。我认为您的查询在这种情况下不起作用,因为它不允许更多的空值 为什么你认为约束不允许超过一个 NULL 值? @BlindSniper:如果是这种情况(事实并非如此),那么coalesce() 实际上会做错事,因为您将 null 替换为 '' 这确实意味着您只能有一个组合a_id 和一个空值。如果没有合并,您可以添加 (1,null), (1,null),但 with 合并将变成将 (1,'') 放入索引中,并且 只允许一次

以上是关于在 PSQL 中为可为空的列添加唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库,非空约束主键约束外键约束唯一约束

使用 SqlBulkCopy 时未(始终)强制执行约束

建数据库表时给一个字段加可为空和默认值为0的约束该怎么加

5-05约束的类型

约束的类型

约束(11)