3-5.MySQLのテーブルの列や属性を変更する方法(CHANGE、RENAME、MODIFY)
設計時から状況が変わり仕様変更が発生して既にテーブルを定義したあとで
列名を変更したい、または属性を変更したいといった事態がおきることがあります。
この場合、以下の構文で行うことが出来ます。
目次
1.構文説明
1)列名と属性を変更する場合 (CHANGEを使用)
ALTER TABLE [テーブル名] change [旧列名] [新列名][属性];
この場合旧属性を同じものにすれば列名だけの変更になります。
2)列名のみを変更する場合(RENAME COLUMNを使用)
ALTER TABLE [テーブル名] RENAME COLUMN [旧列名] TO [新列名];
3)属性のみを変更する場合(MODIFYを使用)
ALTER TABLE [テーブル名] MODIFY [列名] [新属性];
スポンサードサーチ
2.説明と実行例
テーブル名「TABLE01」が以下の定義で存在しているとします。
mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
1)列名と属性を同時に変更する
テーブル「TABLE01」の列名「dataname」を「dataname_jpn」に変更します。
同時に属性も「char(10)」から「varchar(20)」に変更します。
ALTER TABLE TABLE01 CHANGE dataname dataname_jpn varchar(20);
mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> mysql> ALTER TABLE TABLE01 CHANGE dataname dataname_jpn varchar(20); Query OK, 0 rows affected (4.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc table01; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname_jpn | varchar(20) | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
2)列名のみを変更する。
テーブル「TABLE01」の列名「dataname」を「dataname_jpn」に変更します。
属性はそのままです。
(1)CHANGEで変更する方法
ALTER TABLE TABLE01 CHANGE dataname dataname_jpn char(10);
属性を変更前と同じで記述すれば良いですがちょっと冗長ですね。
mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE TABLE01 CHANGE dataname dataname_jpn char(10); Query OK, 0 rows affected (0.24 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc table01; +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname_jpn | char(10) | YES | | NULL | | +--------------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
(2)RENAME COLUMNで記述する方法
ALTER TABLE TABLE01 RENAME COLUMN dataname to databane_jpn;
新旧の列名のみ記述するのでこちらの方法がスマートですね。
mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE TABLE01 RENAME COLUMN dataname to databane_jpn; Query OK, 0 rows affected (0.51 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc table01; +--------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | databane_jpn | char(10) | YES | | NULL | | +--------------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
3)属性のみ変更する方法
ALTER TABLE TABLE01 MODIFY dataname varchar(20);
mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE TABLE01 MODIFY dataname varchar(20); Query OK, 0 rows affected (2.86 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc table01; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | varchar(20) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
属性のみの変更はCHANGEでも記述可能です。
新旧の列名を同じで記述すればよいのですが、少々こちらは冗長で書き方の効率が悪いですね。
ALTER TABLE TABLE01 CHANGE dataname dataname varchar(20);
ALTER TABLE TABLE01 CHANGE dataname dataname varchar(20); mysql> desc table01; +----------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+----------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | char(10) | YES | | NULL | | +----------+----------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE TABLE01 CHANGE dataname dataname varchar(20); Query OK, 0 rows affected (2.63 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc table01; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | keycode | char(10) | YES | | NULL | | | dataname | varchar(20) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
いかがでしたでしょうか、目的に応じていくつか書き方がありますが
最初のうちはCHANGEさえ覚えておけば列名だけでも属性だけでも対応可能です。
慣れてきたら効率の良い書き方をマスターすればいいと思います。