gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:24:36 26 4
gpt4 key购买 nike

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

我的主键是 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 的区别

引用 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 be 什么都不做,或者DO UPDATE。第二种方法通常称为 Upsert - Insert 和 Update 的合成词。

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

关于sql - 如何忽略批量插入Postgresql中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40572948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com