Open Source WEB

2005-09-30 [MySQL] 主キーがなくて重複したレコードを削除し、ALTER TABLEで主キーを追加する

主キーがないテーブルだといくらでも重複できてしまう。

mysql> CREATE TABLE duptest (id INT);
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO duptest VALUES (100);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO duptest VALUES (100);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM duptest;
+------+
| id   |
+------+
|  100 |
|  100 |
+------+
2 rows in set (0.00 sec)

こりゃまずいと思って、 ALTER TABLEで主キーを追加しようと思っても、 すでに重複行があるとエラーが発生する。

mysql> ALTER TABLE duptest ADD PRIMARY KEY (id);
ERROR 1062: Duplicate entry '100' for key 1

かといって

DELETE FROM duptest WHERE id=100;

としてしまうと、重複したすべての行が消えてしまう。

こんなときはMySQLの邪悪なオプション、LIMITを使う。

mysql> DELETE FROM duptest WHERE id=100 LIMIT 1;
Query OK, 1 row affected (0.00 sec)

LIMIT 1とすれば1行だけ削除できる。 (ただし、どの行が削除されるかは分からない)

mysql> ALTER TABLE duptest ADD PRIMARY KEY (id);
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

--yasuyuki

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us