如何忽略批量插入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:
解决方案
您可以使用 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
的区别
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
。请参阅查询计划以进行更深入的研究。
我有一个进程每 5 分钟运行一次,并尝试将一批文章插入 table。这些文章来自 web-scraping,因此在某些情况下,我试图插入包含已保存到数据库中的文章的批次。
我的主键是 uuid
- 文章标题的 MD5 散列。
检查数据库中是否存在文章来过滤批次效率有点低。
在 Postgresql 中忽略插入重复项的尝试 uuid
而不返回错误是数据库级别的方法吗?
您可以尝试 SQL 合并:
https://wiki.postgresql.org/wiki/SQL_MERGE
Merge 可以插入,如果谓词不匹配(在你的情况下,uuid
)。
类似的选项是 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
的区别
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
。请参阅查询计划以进行更深入的研究。