我有一个关系y(k, v)
,其中k是一个关键。
在数据库上有并发连接,我在每个连接上运行:
INSERT INTO y
SELECT 'k1', 'v1' WHERE NOT EXISTS (SELECT 1 FROM y WHERE k = 'k1');
有时我会收到以下错误:
ERROR: duplicate key value violates unique constraint "y_pk"
为什么会这样?可以避免吗?
答案 0 :(得分:1)
这里的问题是,如果此查询同时在两个不同的连接中运行,那么对于BOTH(它在插入之前进行测试),NOT EXISTS条件为真,然后BOTH连接INSERT相同的值。您需要表锁或尝试使用此脚本:
BEGIN
INSERT INTO Y(k,v) VALUES ('k1', 'v1');
EXCEPTION WHEN unique_violation THEN
END;
另请阅读此类似主题:SO:How do I do an UPSERT...
答案 1 :(得分:0)
从PostgreSQL 9.5开始,UPSERTS本身就被支持,并将解决这个用例。