2017-08-09 48 views
1

我试图设置两列(namea)之一,text类型之一和json类型之一之间的唯一约束。我如何在Postgres 9.6.3中构造这个?如何设置具有多列的嵌套JSON的唯一约束

一个例子行的样子:

{ name: 'someName', 
    a: { 
    b: { 
     c: 'some text' 
    } 
    } 
} 

什么是Postgres的命令来创建一个表吗?目前我有这个,它在(附近给出了一个语法错误。

CREATE TABLE行动( ID BIGINT NOT NULL, 名文本, 一个JSON, 唯一(姓名,有效载荷:: JSON#>> '{消息,有效载荷,内容}') );

我也试过

CREATE TABLE action (
    id bigint NOT NULL, 
    name text, 
    a json 
); 
ALTER TABLE actions ADD CONSTRAINT actions_constraint UNIQUE (payload::json#>>'{b, c, d}', name); 

它不断给我这个错误:

ERROR: syntax error at or near "::" 

如何创建这个约束?

回答

2

如果选中文档create table

and table_constraint is:

[CONSTRAINT constraint_name ]

UNIQUE (column_name [, ... ]) index_parameters |

UNIQUECREATE TABLE只接受列名

所以,如果你想在一个表达式索引,您必须将其添加表创建后,该命令是CREATE INDEX(不能通过改变表完成)

create unique INDEX actions_constraint on action (((a#>>'{b, c}')::text), name); 

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ] ({ column_name | (expression) }

+0

谢谢,实际上我的工作是从'{a,b,c}'中删除'a'。因此,答案是“在行动上创建独特的INDEX actions_constraint(((a#>>'{b,c}'):: text),name); '。你能证实这一点,并改变它,所以我可以upvote你的答案? – writofmandamus

+0

@writofmandamus如你所愿 – cske