我有一個進程每5分鐘運行一次,並嘗試將一批文章插入表中。這些文章來自網絡報廢,所以有些情況下我試圖插入包含已保存到數據庫中的文章的批處理。批量插入時忽略錯誤Postgresql
我的主鍵是uuid
- 文章標題的MD5散列。
檢查數據庫中是否存在文章以過濾批處理效率不高。
它是Postgresql中的數據庫級別的方式來忽略插入重複uuid
而不返回錯誤的嘗試?
我有一個進程每5分鐘運行一次,並嘗試將一批文章插入表中。這些文章來自網絡報廢,所以有些情況下我試圖插入包含已保存到數據庫中的文章的批處理。批量插入時忽略錯誤Postgresql
我的主鍵是uuid
- 文章標題的MD5散列。
檢查數據庫中是否存在文章以過濾批處理效率不高。
它是Postgresql中的數據庫級別的方式來忽略插入重複uuid
而不返回錯誤的嘗試?
你可以插入使用WHERE NOT EXISTS
條款。
例如,考慮一個test
表,其中數字爲id
爲主鍵,文本爲name
。
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 CONFILCT
ON CONFLICT
可用於指定其他行動來提高一個唯一約束或排他條件衝突錯誤。
The action can beDO NOTHING
或DO UPDATE
。第二種方法通常被稱爲Upsert - 插入和更新的portmanteau。
技術上WHERE NOT EXISTS
相當於ON CONFILCT DO NOTHING
。查看更深入潛水的查詢計劃。
你可以嘗試SQL MERGE:
https://wiki.postgresql.org/wiki/SQL_MERGE
合併可以插入,如果謂語不匹配(在你的情況,uuid
)。
類似的選項是UPSERT:
請注意,這些選項僅適用於最新的PostgreSQL版本。 –
和'衝突不做什麼一樣;'? –
@AvraamMavridis更新了我的答案 –