次のテスト コードを使用して新しい PostgreSQLアップサート構文をテストしようとしていますが、構文エラーが発生します。
test=> CREATE TABLE test1 (
test(> key1 integer PRIMARY KEY check (key1 > 0),
test(> key2 integer check (key2 > 0)
test(> );
CREATE TABLE
test=> CREATE OR REPLACE FUNCTION upsert(IN in_json_array jsonb)
test-> RETURNS void AS
test-> $func$
test$> UPDATE test1 t SET
test$> t.key1 = (obj->>'key1')::int,
test$> t.key2 = (obj->>'key2')::int
test$> FROM JSONB_ARRAY_ELEMENTS(in_json_array) obj
test$> WHERE t.key1 = obj->'key1'
test$> ON CONFLICT DO UPDATE SET
test$> key1 = excluded.key1,
test$> key2 = excluded.key2;
test$>
test$> $func$ LANGUAGE sql;
ERROR: syntax error at or near "ON"
LINE 9: ON CONFLICT DO UPDATE SET
^
上記のコードが失敗するのはなぜですか?
また、test1
テーブルにはいくつかの制約があります (非負の値と一意の主キー)。一意性制約のみに対処する方法は?
更新 2:から に切り替えましUPDATE
たINSERT
(ばかげた間違いで申し訳ありません!) が、まだ構文に苦労しています:
test=> CREATE OR REPLACE FUNCTION upsert(IN in_json_array jsonb)
test-> RETURNS void AS
test-> $func$
test$> INSERT into test1 AS t (t.key1, t.key2)
test$> VALUES ((obj->>'key1')::int, (obj->>'key2')::int)
test$> FROM JSONB_ARRAY_ELEMENTS(in_json_array) obj
test$> WHERE t.key1 = obj->'key1'
test$> ON CONFLICT DO UPDATE SET
test$> t.key1 = excluded.key1,
test$> t.key2 = excluded.key2;
test$> $func$ LANGUAGE sql;
ERROR: syntax error at or near "FROM"
LINE 6: FROM JSONB_ARRAY_ELEMENTS(in_json_array) obj
^
また、JSON 行を次のように変更しようとしました。
SELECT obj FROM JSONB_ARRAY_ELEMENTS(in_json_array)
しかし、それも失敗します...
便宜上、私のテストコードを次に示します。
select upsert('[{"key1":1,"key2":2},{"key1":3,"key2":4}]'::jsonb);
select upsert('[{"key1":1,"key2":2},{"key1":1,"key2":4}]'::jsonb);