MySQLでalter tableしてauto_incrementなcolumnをaddしたい

と思ったけどすんなり行かなかったのでメモ。

+-------+--------------+------+-----+
| Field | Type         | Null | Key |
+-------+--------------+------+-----+
| id    | char(32)     | NO   | PRI |
| title | varchar(300) | NO   |     |
+-------+--------------+------+-----+

↑のようなテーブルhogeにauto_encrementなfugaカラムを追加しようとしたが・・・

mysql> alter table hoge add column fuga int
 NOT NULL AUTO_INCREMENT after id;

ERROR 1075 (42000): Incorrect table definition;
 there can be only one auto column and it must be defined as a key

だめ。マニュアルによると「AUTO_INCREMENT カラムはインデックスされなければいけない」らしい。
http://dev.mysql.com/doc/refman/5.1/ja/alter-table.html

mysql> alter table hoge add column fuga int
 NOT NULL AUTO_INCREMENT KEY after id;

ERROR 1068 (42000): Multiple primary key defined

だめ。それならばと「KEY」って書いたら、主キー追加しようとしてると思われた><

mysql> alter table hoge add column fuga int
 NOT NULL AUTO_INCREMENT after id, ADD INDEX (fuga);

↑というわけでこれが正解。


ただし、

レプリケーションが利用された時、テーブルに AUTO_INCREMENT カラムを追加してもスレーブとマスターの行は同じ順番にはならないでしょう。

ということらしいのでレプリケーションしてる場合は一工夫いるかも。

※手元の環境で試したら、工夫しなくてもm/sともにちゃんと同じ番号が振られた。