我有一个进程每5分钟运行一次,并尝试将一批文章插入表中。这些文章来自网络报废,所以有些情况下我试图插入包含已保存到数据库中的文章的批处理。批量插入时忽略错误Postgresql
我的主键是uuid
- 文章标题的MD5散列。
检查数据库中是否存在文章以过滤批处理效率不高。
它是Postgresql中的数据库级别的方式来忽略插入重复uuid
而不返回错误的尝试?
我有一个进程每5分钟运行一次,并尝试将一批文章插入表中。这些文章来自网络报废,所以有些情况下我试图插入包含已保存到数据库中的文章的批处理。批量插入时忽略错误Postgresql
我的主键是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
ON CONFLICT
可用于指定其他行动来提高一个唯一约束或排他条件冲突错误。
The action can beDO NOTHING
或DO UPDATE
。第二种方法通常被称为Upsert - 插入和更新的portmanteau。
技术上WHERE NOT EXISTS
相当于ON CONFILCT DO NOTHING
。查看更深入潜水的查询计划。
你可以尝试SQL MERGE:
https://wiki.postgresql.org/wiki/SQL_MERGE
合并可以插入,如果谓语不匹配(在你的情况,uuid
)。
类似的选项是UPSERT:
请注意,这些选项仅适用于最新的PostgreSQL版本。 –
和'冲突不做什么一样;'? –
@AvraamMavridis更新了我的答案 –