在 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 中为可为空的列添加唯一约束的主要内容,如果未能解决你的问题,请参考以下文章