我试图对一个可以有空JSON对象的列设置一个唯一的约束。我用的是Postgres9.6.3。
问题是Postgres将它们视为唯一的,因为我可以插入具有相同值的多行。我认为这与Postgres如何将空值视为唯一值有关。我怎么能避开这个?
最佳答案
您可以使用一个普通的惟一索引,将json视为文本。下面是一个完整的示例,说明了它的工作原理(已更正):
创建表:create table tmp (payload json, name text);
创建我们的索引:create unique index testindex on tmp ((payload::text), name);
插入一些行。前四个会成功,其余的会失败。
insert into tmp (payload, name) values ('{}', 'foo');
// Succeeds
insert into tmp (payload, name) values ('{}', 'bar');
// Succeeds
insert into tmp (payload, name) values ('{"a":"b"}'::json, 'foo');
// Succeeds
insert into tmp (payload, name) values ('{"a":"b"}'::json, 'bar');
// Succeeds
insert into tmp (payload, name) values ('{"a":"b"}'::json, 'foo');
// Fails due to index
insert into tmp (payload, name) values ('{}', 'bar');
// Fails due to index
如果这里的某些东西没有如你所期望的那样工作,请澄清。
关于json - 如何使一个空的JSON对象在Postgres中不是唯一的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45597529/