【发布时间】:2018-08-07 02:32:21
【问题描述】:
让我用一个简单的例子来描述我的问题。假设我有一个只有两个字段的表 t,自动“id”和一个 jsonb 类型的“信息”字段:
CREATE TABLE t(
ID serial NOT NULL PRIMARY KEY,
info jsonb NOT NULL
);
'info' 可能有字段 'a'、'b'、'c' 以及其他一些字段。字段 'c' 可能为空,我希望 (a, b, c) 是唯一的,因此我在它们上创建了唯一索引:
CREATE UNIQUE INDEX idx_abc ON t (
(info ->> 'a'), (info ->> 'b'), (info ->> 'c')
);
但后来我意识到,如果 'c' 为 null,则此唯一约束根本不起作用。例如,我可以插入多行:
insert into t(info) values('{"a": "a1", "b": "b1"}')
或
insert into t(info) values('{"a": "a1", "b": "b1", "c": null}')
我目前的解决方案是无论如何给“c”一个值,如果“c”为空,那么我设置“空”:
insert into t(info) values('{"a": "a1", "b": "b1", "c": "null"}')
如果我运行插入两次,这种方式将触发唯一约束。但我觉得这只是一种解决方法,我想知道是否有更好的解决方案来允许唯一约束工作,即使字段“c”为空。
【问题讨论】:
-
BSON?你的意思是
jsonb,对吧?请记住始终声明您的 Postgres 版本。
标签: postgresql database-design null unique-constraint jsonb