如何忽略批量插入Postgresql中的错误

How to Ignore error in batch insert Postgresql

我有一个进程每 5 分钟运行一次,并尝试将一批文章插入 table。这些文章来自 web-scraping,因此在某些情况下,我试图插入包含已保存到数据库中的文章的批次。

我的主键是 uuid - 文章标题的 MD5 散列。

检查数据库中是否存在文章来过滤批次效率有点低。

在 Postgresql 中忽略插入重复项的尝试 uuid 而不返回错误是数据库级别的方法吗?

您可以尝试 SQL 合并:

https://wiki.postgresql.org/wiki/SQL_MERGE

Merge 可以插入,如果谓词不匹配(在你的情况下,uuid)。

类似的选项是 UPSERT:

https://wiki.postgresql.org/wiki/UPSERT

解决方案

您可以使用 WHERE NOT EXISTS 子句插入。

例如,考虑一个 test table,其中数字 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 can be used to specify an alternative action to raising a unique constraint or exclusion constraint violation error.

The action can beDO NOTHING,或者一个DO UPDATE。第二种方法通常称为 Upsert - Insert 和 Update 的合成词。

技术上 WHERE NOT EXISTS 等同于 ON CONFILCT DO NOTHING。请参阅查询计划以进行更深入的研究。