MySQL
SQL
mariadb

[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