我有一个每5分钟运行一次的进程,并尝试将一批文章插入表中.这些文章来自网络报废,因此在某些情况下我试图插入一个包含已保存到数据库中的文章的批次.
我的主键是uuid – 文章标题的MD5哈希.
检查数据库中是否存在文章以过滤批处理是有效的.
它是Postgresql中的数据库级方式忽略插入重复的uuid而不返回错误的尝试吗?
最佳答案 解
您可以使用WHERE NOT EXISTS子句插入.
例如,考虑一个带有数字id作为主键和文本名称的测试表.
码
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 be无所事事或DO更新.第二种方法通常被称为Upsert – 插入和更新的端口.
从技术上讲,不存在等同于ON CONFILCT DO NOTHING.查看更深入的潜水查询计划.