Duplicate key value violates unique constraint in postgres even though key does not exist?
我使用的查询如下 -
1 2 3 4 5 6 7 8 | INSERT INTO mytable(id, tp, booleanOne, classification, booleantwo, created_at) SELECT DISTINCT uttv.id, TRUE, FALSE, uttv.type, FALSE, uttv.created_at FROM userTable tt WHERE booleantwo = FALSE AND TYPE IS NOT NULL AND tt.id IN ( SELECT id FROM userTable WHERE STATUS=12 AND booleantwo=FALSE AND booleanThree=FALSE UNION SELECT id FROM userTable WHERE STATUS=19 ) AND NOT EXISTS (SELECT 1 FROM mytable rre WHERE rre.id = tt.id) |
该表的主键是mytable.id
运行此查询时,我一直看到以下错误 -
1 | KEY (id)=(2556) already EXISTS.; nested exception IS org.postgresql.util.PSQLException: ERROR: duplicate KEY VALUE violates UNIQUE CONSTRAINT"mytable_modified_pkey |
当我检查mytable时,我没有看到任何匹配2556的id。
此查询作为spring boot项目的一部分运行,我将隔离级别设置为Seriablizable。
我认为在查询中有一个UNION将确保没有重复的id,然后在外部SELECT查询中使用distinct将进一步确保我们只插入非重复项。我知道这个错误正在发生,因为选择查询可能会返回一些重复,但即使这样,你会看到我使用 -"并且不是EXISTS"并确保如果id已经存在,请不要插入。
关于我为什么看到这个错误的任何输入将非常感激。这个查询也很慢。
我还尝试通过按ID分组执行查询的SELECT部分??,并检查是否有任何ID出现多次,但我没有看到任何记录。现在我可以看到有重复。
1 2 3 4 5 6 | SELECT tags.tag_id, COUNT(1) FROM (SELECT DISTINCT uttv.id, TRUE, FALSE, uttv.type, FALSE, uttv.created_at FROM userTable tt WHERE booleantwo = FALSE AND TYPE IS NOT NULL AND tt.id IN ( SELECT id FROM userTable WHERE STATUS=12 AND booleantwo=FALSE AND booleanThree=FALSE UNION SELECT id FROM userTable WHERE STATUS=19 ) AS tags GROUP BY tags.tag_id HAVING COUNT(1) > 1 |
我会说