2017-08-09 5 views
1

2つの列(namea)、textのいずれか、およびjsonのうちの1つの間に一意制約を設定しようとしています。これをPostgres 9.6.3でどのように構造化するのですか? Postgresは、このためのテーブルを作成するためのコマンドは何複数の列を含むネストされたJSONに一意制約を設定する方法

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

例の行は次のようになりますか?現在私は(の近くで構文エラーを示しています。

テーブルアクション(NULL NOT のID BIGINT、 名テキスト、 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 "::" 

どのように私はこの制約を作成することができますか? CREATE TABLE

答えて

2

あなたがドキュメントをチェックした場合create table

and table_constraint is:

[CONSTRAINT constraint_name ]

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

UNIQUEだけが表現上のインデックスをしたい場合は、テーブルを作成した後、あなたはそれを追加する必要があり、そのためのコマンドが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

関連する問題