重複レコードをSQLデータベースから一括削除

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2007-01-15 【ジャンル】PHP/MySQL


 MySQLでデータベース操作をしていると、間違って同一データを複数回データベースに挿入してしまうことがあります。すなわち重複レコードの発生です。
 そのような時は「SELECT DISTINCT」を使ってデータを取り出せばいいのですが、たまに重複レコードを削除して取り出せないケースも出てきます。また、データ(レコード数)が多くなってくると、重複したレコードをデータベースから一括して削除したくなります。

 先ほどSQL文を作成して重複レコードをテーブルから一括削除したのですが、今後使うこともありそうなので備忘的にサンプルソースを残しておきます。
  
 次のようなテーブル「main_table」があるとします。「2006-01」「イヌ」が3つ、「2006-02」「ネコ」が2つ重複しています。

●テーブル「main_table」(※SQL実行前)

field_1
field_2
field_3
field_4
2006-01
イヌ
15
6
2006-01
イヌ
15
6
2006-01
イヌ
15
6
2006-02
ネコ
5
26
2006-02
ネコ
5
26
2006-02
イヌ
23
12

 まず、一時的にテーブル「temp_table」を作成します。テーブル「main_table」をコピーするのですが、ポイントは重複に関係するフィールドでグループ化することです。
 下記ソースは、フィールド「field_1」とフィールド「field_2」でグループ化した例です。
//●ソース1
  mysql_query("CREATE TABLE temp_table as SELECT * FROM main_table GROUP BY field_1, field_2");
 phpMyAdmin等で、テーブル「temp_table」から重複レコードが削除されていることを確認後に、下記SQL文を実行します。
//●ソース2
  mysql_query("DROP TABLE main_table");
  mysql_query("ALTER TABLE temp_table RENAME TO main_table");
 すると、テーブル「main_table」は下記のようになると思います。

●テーブル「main_table」(※SQL実行後)

field_1
field_2
field_3
field_4
2006-01
イヌ
15
6
2006-02
ネコ
5
26
2006-02
イヌ
23
12

 テーブル「main_table」を一度削除することになるので、テーブル「temp_table」の確認作業はしっかり行ってください。(くれぐれも自己責任でお願いします)

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript