2016-11-13 196 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更新了我的答案 –