MySQL テーブルにデータが格納されている状態で、テーブル再作成を余儀なくされた時

【事象】

データが格納されている MySQLのテーブルで、カラムを追加して複合プライマリキーを付与しようとした際、
「ERROR 1068 (42000): Multiple primary key defined」と表示され、付与できない。
(最終的には、付与する必要は無くなったが)
対象のテーブルは、カラムの1つに「auto_increment」を設定している状態。

【やったこと】

いくつか試してみたが、データをバックアップしてからテーブル再作成を行った。
※ カラム追加なので、既存のカラム名変更や型変更等は行っていない

対象のテーブル名は「address_list」

1. テーブル構造の出力

「show create table address_list」で出力。結果をテキストエディタへコピペ。
このcreate table文に、新カラムや型情報を追加。
PRIMARY KEY 行の部分に、新カラム名を追加

2. mysqldump に 「-c」オプションと付けて実行

当初は、
「mysqldump -u dbuser -p -t SampleDB address_list > address_list.sql」 を実行。
-t オプション -> テーブル構造は出力しない
これは、「4. データのリストア」で失敗する。
address_list.sqlを見れば分かるが、
INSERT INTO `address_list` VALUES ・・・
と、カラム名が書き出されていないので、カラムの総数が違うとエラーが吐かれる。

よって、
「mysqldump -u dbuser -p -t -c SampleDB address_list > address_list.sql」 を実行。
-c オプション -> カラム名を出力する
address_list.sqlでは、
INSERT INTO `address_list` (`id`, `ganre_id`, `company_id`, `username`, `address`) VALUES ・・・
と、カラム名が追加された

念のため、
「mysqldump -u dbuser -p SampleDB address_list > address_list.org.sql」
を実行して、元に戻す用データも取得しておく

3. 思い切ってdrop table

「drop table address_list」でテーブル削除
1. で作成した create table文を実行して、テーブル作成。
「desc address_list」でテーブル構造を確認

4. データのリストア

「mysql -u dbuser -p SampleDB < address_list.sql」でデータ復元

【最後に】

そもそも、テーブル作成後にカラム追加するなどという事は、本番環境では稀だと思う。
HDD故障や有事の際のDBバックアップとして、定期的にmysqldumpで取得しているケースが多いと思うが、
今回はテーブル構造を変更してからのデータの戻し作業だったので、カラム名も出力する
mysqldumpの「-c」オプションが役に立った。