重複レコードを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文を実行します。mysql_query("CREATE TABLE temp_table as SELECT * FROM main_table GROUP BY field_1, field_2");
//●ソース2
mysql_query("DROP TABLE main_table");
mysql_query("ALTER TABLE temp_table RENAME TO main_table");
すると、テーブル「main_table」は下記のようになると思います。mysql_query("DROP TABLE main_table");
mysql_query("ALTER TABLE temp_table RENAME TO 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