繁体   English   中英

如何在PostgreSQL中对JSON类型使用唯一约束

[英]How to use unique constraint for json type in postgresql

如何在postgresql中为“ json”列设置唯一约束? Unique对我而言意味着:如果每个键都匹配且json对象的每个值都匹配,则json对象是唯一的。

您的版本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哈希'{"foo": 42, "bar": "value"}''{"bar": "value"}, "foo": 42'


索引大文本值的解决方案的一些问题:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM