关于postgresql:重复的键值违反了postgres中的唯一约束,即使键不存在?

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


我会说SELECT返回多行,并且对于employee上有唯一约束的列具有相同的值。