我有下一个示例代码:
CREATE TABLE books ( id integer, data json );
INSERT INTO books VALUES (1,
'{ id: 1,id: 1,"name": "Book the First" }');
你可以看到id
是JSON格式中的一个重复的字段,我知道PostgreSQL有一些功能可以避免这个问题,但我找不到它。
答案 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));