LoginSignup
48
46

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-10

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
46