ソリューション
あなたは
WHERE NOT EXISTS
句を使用して挿入することができ
:
同様のオプションがUPSERTです。
たとえば、数字id
がプライマリキーで、テキストがname
のtest
という表があるとします。 the documentationを引用ON CONFILCT
から
コード
db=> CREATE TABLE test(id BIGSERIAL PRIMARY KEY, name TEXT);
CREATE TABLE
-- Insertion will work - empty table
db=> INSERT INTO test(id, name)
SELECT 1, 'Partner number 1'
WHERE NOT EXISTS (SELECT 1,2 FROM test WHERE id=1);
INSERT 0 1
-- Insertion will NOT work - duplicate id
db=> INSERT INTO test(id, name)
SELECT 1, 'Partner number 1'
WHERE NOT EXISTS (SELECT 1,2 FROM test WHERE id=1);
INSERT 0 0
-- After two insertions, the table contains only one row
db=> SELECT * FROM test;
id | name
----+------------------
1 | Partner number 1
(1 row)
差:
ON CONFLICT
はユニーク制約または排他制約違反エラーを上げるの代替アクションを指定するために使用することができます。
The action can beDO NOTHING
またはDO UPDATE
です。 2番目のアプローチは、しばしばUpsertと呼ばれ、挿入と更新のportmanteauです。
技術的にはWHERE NOT EXISTS
はON CONFILCT DO NOTHING
に相当します。より深いダイビングについては、クエリプランを参照してください。
は「ON CONFLICT DO NOTHING;」と同じですか? –
@AvraamMavridis最新の回答 –