2016-10-03 28 views
-1

次のように私が使用しているクエリがある -キーが存在しないにもかかわらず重複キー値がポストグルの一意性制約に違反していますか?

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 
+0

私はそれが重複しているとは思わない。 INSERT文にはWHERE句がありません。 –

答えて

1

私はSELECTemployeeに一意性制約が存在している列の同じ値を持つ複数の行を返すことを言うだろう。

+0

それは本当ですが、クエリでIDのすべての言及を区別しようとすると、なぜ問題が解決しないのですか? – Tisha

+0

これは正確なSQL文と選択したテーブルによって決まります。まず 'SELECT'文をデバッグしてみてください。 –

関連する問題