次のように私が使用しているクエリがある -キーが存在しないにもかかわらず重複キー値がポストグルの一意性制約に違反していますか?
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 -
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を見ません。
このクエリはスプリングブートプロジェクトの一部として実行されており、分離レベルは直列化可能として設定されています。
クエリでUNIONを使用すると重複IDがないことが保証され、外部SELECTクエリでdistinctを使用すると、重複を挿入しないようにすることができます。私はこのエラーが起こっていることを知っています。なぜならselectクエリは恐らくいくつかの重複を返すでしょうが、それでも私は - "AND NOT EXISTS"を使用していて、idがすでに存在するなら挿入しないことを確認します。
このエラーが表示される理由についての入力は、本当に高く評価されます。このクエリも非常に遅いです。
IDでグループ化してIDのいずれかが複数回出現するかどうかを確認しても、クエリのSELECT部分だけを実行しようとしましたが、そのレコードが表示されません。そして、今私は重複があることがわかります。
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
私はそれが重複しているとは思わない。 INSERT文にはWHERE句がありません。 –