如何避免PostgreSQL JSON数据类型中的重复值?

时间:2016-05-12 01:26:50

标签: postgresql psql

我有下一个示例代码:

CREATE TABLE books ( id integer, data json );

INSERT INTO books VALUES (1,
  '{ id: 1,id: 1,"name": "Book the First" }');

你可以看到id是JSON格式中的一个重复的字段,我知道PostgreSQL有一些功能可以避免这个问题,但我找不到它。

2 个答案:

答案 0 :(得分:3)

JSONB将自动执行此操作:http://www.postgresql.org/docs/9.5/static/datatype-json.html

  

相比之下,jsonb不保留空格,不保留对象键的顺序,也不保留重复的对象键。如果在输入中指定了重复键,则仅保留最后一个值。

所以只需使用9.4及更高版本并将表格列更改为jsonb:

CREATE TABLE books ( id integer, data jsonb );

答案 1 :(得分:0)

您可以创建一个函数来检查重复的键,并将其设置为表的json字段中的检查约束:

create function jsondupkey(json) returns bool as $$
  select exists (select 1 from json_each($1) group by key having count(*)>1)
$$ language sql;

alter table books alter column data add check (not jsondupkey(data));