2017-08-09 133 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