レコードの重複を防ぐための一般的なアプローチは、関連するテーブル列に一意のインデックスを作成することです。しかし、最近の間違いにより、代わりに通常のインデックスが作成され、2,000 万もの大規模なレコード テーブル内で重複が永続化されてしまいました。
質問: 既存のインデックスを一意に変更するか、追加する必要がありますか?これらの列に新しい一意のインデックスを作成すると、重複レコードが削除されますか? それとも、既存の一意のエントリが原因で操作が失敗しますか?
回答:
IGNORE を使用して一意のインデックスを追加します。修飾子は重複レコードを削除します:
<code class="sql">ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
ただし、この修飾子は MySQL 5.7.4 以降では非推奨となり、エラーが発生します。この問題を回避するには、次の手順を実行できます:
元のテーブルのデータを保持する一時テーブルを作成します:
<code class="sql">CREATE TABLE tmp_data SELECT * FROM mytable;</code>
元のテーブルを切り詰めます:
<code class="sql">TRUNCATE TABLE mytable;</code>
元のテーブルに一意のインデックスを作成します:
<code class="sql">ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
データをコピーして戻します重複行を無視して元のテーブルにコピーします:
<code class="sql">INSERT IGNORE INTO mytable SELECT * from tmp_data;</code>
一時テーブルをドロップします:
<code class="sql">DROP TABLE tmp_data;</code>
または、一意のインデックスを追加します。 IGNORE 修飾子を使用しない場合、クエリはエラー 1062 (重複キー) で失敗します。
以上が**既存のインデックスを一意に変更するか、新しいインデックスを追加することで重複レコードを削除できますか?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。