2016-11-13 193 views
3

我有一個進程每5分鐘運行一次,並嘗試將一批文章插入表中。這些文章來自網絡報廢,所以有些情況下我試圖插入包含已保存到數據庫中的文章的批處理。批量插入時忽略錯誤Postgresql

我的主鍵是uuid - 文章標題的MD5散列。

檢查數據庫中是否存在文章以過濾批處理效率不高。

它是Postgresql中的數據庫級別的方式來忽略插入重複uuid而不返回錯誤的嘗試?

回答

2

解決方案

你可以插入使用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

報價the documentation

ON CONFLICT可用於指定其他行動來提高一個唯一約束或排他條件衝突錯誤。

The action can beDO NOTHINGDO UPDATE。第二種方法通常被稱爲Upsert - 插入和更新的portmanteau。

技術上WHERE NOT EXISTS相當於ON CONFILCT DO NOTHING。查看更深入潛水的查詢計劃。

+0

和'衝突不做什麼一樣;'? –

+0

@AvraamMavridis更新了我的答案 –