如何在postgresql中为“ json”列设置唯一约束? Unique对我而言意味着:如果每个键都匹配且json对象的每个值都匹配,那么json对象就是唯一的。
答案 0 :(得分:3)
这对于您有些过时的9.4版是不可能的
Postgres 9.5引入了另一种JSON类型,名为jsonb
,它确实支持相等运算符。因此,如果您确实需要此功能,则必须升级到最新版本(例如10或11)
json
数据类型保留了输入值的顺序,因此使比较真的很复杂(至少效率不高)。
jsonb
类型标准化键/值并将数据存储在二进制中
格式,可以进行有效的相等性检查
例如
'{"foo": 42, "bar": "value"}'::jsonb = '{"bar": "value", "foo": 42}'::jsonb
返回true
。强制转换为json
的相同表达式会导致错误。
因此以下DDL有效:
create table data
(
id serial primary key,
payload jsonb,
unique (payload)
);
但是,对索引条目的大小有一个限制(大约2000字节)。因此,可能发生的情况是,将数据插入此类表失败的原因不是因为违反了唯一约束,而是因为JSON值太大。
Postgres 9.4的一个选项是在JSON值的MD5哈希上创建唯一索引。
create unique index on data ( md5(payload::text) );
但是,如果您始终以完全相同的顺序指定JSON中的键,那么这将仅有效。因为'{"foo": 42, "bar": "value"}'
的md5哈希值与'{"bar": "value"}, "foo": 42'
的md5哈希值不同
一些索引大文本值的解决方案的问题: