2017-09-06 12 views
0

フィールドの一意性を維持しながら:挿入JSONドキュメント以下の表でPostgreSQLのJSONレコード(9.5.4)を挿入/更新しようと

create table (detail jsonb); 

insert into table VALUES ('{"name": "tom", "zip": 88717, "city": "dallas"}'); 

は私がUIから私が欲しいJSON {"name": "tom", "zip": 78717, "city": "houston"}を取得すると仮定名前フィールドの一意性を維持しながら更新/挿入する。

insert into jsonTest VALUES ('{"name": "tom", "zip": 78717, "city": "houston"}') 
on conflict (detail->'name') 
do update set detail = '{"name": "tom", "zip": 78717, "city": "houston"}'::jsonb where detail->>'name' == 'tom'; 

答えて

1

あなたはdetail->>'name'にUNIQUEインデックスを作成したと仮定すると、あなたの挿入は次のようになります:

insert into jsonTest VALUES ('{"name": "tom", "zip": 78717, "city": "houston"}') 
on conflict ((detail->>'name')) 
do update set detail = '{"name": "tom", "zip": 78717, "city": "houston"}'::jsonb 
エラーの原因となったSQL文の次が、取得エラーここ

ERROR: syntax error at or near "->" 
LINE 2: on conflict (detail->'name') 

をされてみました

on conflict ((detail->>'name'))に別の括弧を追加し、where句を削除しました。

EDIT:

CREATE UNIQUE INDEX jsonTest_name_index ON jsonTest((detail->>'name')) ; 

インデックスが作成された後、あなたは問題なく「CONFLICT ON INSERT」を使用することができます:あなたは次の操作を行うことができますdetail->>'name'に一意索引を作成します。

+0

ありがとう@ j-alderete、この場合ユニークなインデックスを作成するにはどうすればよいですか? – pktCoder

+0

私は答えを更新しました。 –

+0

もう一度@ j-aldereteに感謝します!できます。 – pktCoder

関連する問題