Edited at

[MySQL] AUTO_INCREMENTカラム変更がめんどくさい・・

More than 3 years have passed since last update.

たとえば、こんなテーブルがあるじゃないですか、このテーブルってidっていうのが、プライマリーキーなのですが

CREATE TABLE `users` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`seq_id` int(10) unsigned NOT NULL ,
`name` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
)
;

これを、こういうふうにseq_idをPRIMARY KEYにして、そいつに、AUTO_INCREMENTをしかけようとしても簡単にいかない・・・あぁ・・

CREATE TABLE `users` (

`id` int(10) unsigned NOT NULL ,
`seq_id` int(10) unsigned NOT NULL NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`seq_id`)
)
;

流れ的にこういうふうにやるとは思うのですが

まずは、PRIMARY KEY のDROP


  • オートインクリメントが設定されているからダメだってさ

ALTER TABLE users DROP PRIMARY KEY ;

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

なので、結構めんどうな手順を踏みます。それが以下の手順


  • オートインクリメントの属性のカラムを変更して、はずす!

ALTER TABLE users CHANGE COLUMN `id` `id` int(10) unsigned NOT NULL ;


  • 次に既存のプライマリーキーをドロップする!!

ALTER TABLE users DROP PRIMARY KEY ;


  • 新しいカラムにプライマリーキーを設定する

ALTER TABLE users ADD PRIMARY KEY (seq_id) ;


  • 新しいカラムの属性を、AUTO_INCREMENTにする

ALTER TABLE users CHANGE COLUMN `seq_id` `seq_id` int(10) unsigned NOT NULL NULL AUTO_INCREMENT;


ここまでやって、やっと変更ができるようになる!めんどくさい!!

 CREATE TABLE `users` (

`id` int(10) unsigned NOT NULL,
`seq_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
PRIMARY KEY (`seq_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

・・という、ほぼ愚痴です


とにかく面倒なので・・


shell 作ってみました

例えば、該当テーブルが一律idと、seq_idっていうフィールドがあるのだったら、こんなSQL実行すれば、いとも簡単に実行することができます。(動かしてないけど、きっと動くでしょう)

#!/bin/bash

_schema=test

mysql -vvv -uroot -p << _EOT_
SELECT
'USE
${_schema} ; ' ||
' ALTER TABLE ' || TABLE_NAME || ' CHANGE COLUMN id id int(10) unsigned NOT NULL ;' ||
' ALTER TABLE ' || TABLE_NAME || ' DROP PRIMARY KEY ;' ||
' ALTER TABLE ' || TABLE_NAME || ' CHANGE seq_id seq_id bigint(20) AUTO_INCREMENT ;'
AS STRSQL
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = '
${_schema}'
_EOT_

exit 0