sql >> データベース >  >> RDS >> PostgreSQL

テーブルから重複を削除し、参照行を新しいマスターに再リンクします

    この1つのコマンドですべてを実行できます:

    WITH blacklist AS (  -- identify duplicate IDs and their master
       SELECT *
       FROM  (
          SELECT transcription_id
               , min(transcription_id) OVER (PARTITION BY text, citation) AS master_id
          FROM   transcription
          ) sub
       WHERE  transcription_id <> master_id
       )
    , upd AS (  -- redirect referencing rows
       UPDATE town_transcription tt
       SET    transcription_id = b.master_id
       FROM   blacklist b
       WHERE  b.transcription_id = tt.transcription_id
       )
    DELETE FROM transcription t  -- kill dupes (now without reference)
    USING  blacklist b
    WHERE  b.transcription_id = t.transcription_id;
    

    定義が不足しているため、グループごとのIDが最小の行を存続するマスター行として選択しました。

    デフォルト以外の設定がない限り、FK制約は邪魔になりません。詳細な説明:

    重複を削除した後、UNIQUEを追加することをお勧めします 同じエラーが再発しないようにするための制約:

    ALTER TABLE transcription
    ADD CONSTRAINT transcription_uni UNIQUE (text, citation);
    


    1. MySQLクエリを実行せずに有効かどうかを確認するにはどうすればよいですか?

    2. PostgreSQLで条件付きサブクエリを使用して一意のインデックスを作成するにはどうすればよいですか?

    3. グローバル一時テーブル-SQLServerとOracle

    4. PHPデータベースはデータを保存しません