たとえば、こんなテーブルがあるじゃないですか、このテーブルって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