2016-11-13 4 views
3

5分ごとに実行されるプロセスがあり、アーティクルのバッチをテーブルに挿入しようとしています。記事はWeb-Scrappingに由来しているので、すでにDBに保存されている記事を含むバッチを挿入しようとしている場合があります。バッチインサートのエラーを無視するPostgresql

私の主キーはuuid - 記事タイトルのMD5ハッシュです。

バッチをフィルタリングする記事がdb内に存在するかどうかを確認するのはちょっと効率が悪いです。

PostgreSQLのDBレベルで、エラーを返さずに複製uuidを挿入しようとする試みを無視しますか?

答えて

2

ソリューション

あなたは WHERE NOT EXISTS句を使用して挿入することができ

同様のオプションがUPSERTです。

たとえば、数字idがプライマリキーで、テキストがnametestという表があるとします。 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 EXISTSON CONFILCT DO NOTHINGに相当します。より深いダイビングについては、クエリプランを参照してください。

+0

は「ON CONFLICT DO NOTHING;」と同じですか? –

+0

@AvraamMavridis最新の回答 –

関連する問題