在我的postgresql数据库中,我有一个名为“my_table”的表,它的主键是(a, b)列。
我编写了以下查询语句,用于向此表插入数据,以确保永远不会违反主键约束。
INSERT INTO my_table(a, b, c, d, e, f)
(SELECT 'a1',
'b1',
'c1',
1442849052013,
1,
FALSE
FROM
(SELECT 'a1'::VARCHAR(100) AS a,
'b1'::VARCHAR(50) AS b) AS new_fields
LEFT OUTER JOIN my_table AS old_fields ON (new_fields.a = old_fields.a
AND new_fields.b = old_fields.b)
WHERE old_fields.a IS NULL);
由于多个线程同时运行,因此会执行多个类似的查询。有时候我会遇到PSQLException: duplicate key value violates unique constraint "my_table_pkey". Detail: Key (a, b)=(a1, b1) already exists.(PSQLException:重复键值违反唯一约束条件"my_table_pkey"。详细信息:键(a,b)=(a1,b1)已经存在)的错误。
我无法理解为什么这个查询会导致指定的错误情况,因为该查询仅在主键列缺失时才插入到“my_table”中,并且此条件在同一查询中进行检查。
如果这是有效的场景,这是否意味着PostgreSQL中的查询执行不是原子性的?
能否有人解释一下...
这里,Select For Update语法也不起作用,因为Select For Update会锁定所选行,而我想要插入一行(如果它不存在)。