3-5.MySQLのテーブルの列や属性を変更する方法(CHANGE、RENAME、MODIFY)

2019年7月21日

設計時から状況が変わり仕様変更が発生して既にテーブルを定義したあとで
列名を変更したい、または属性を変更したいといった事態がおきることがあります。

この場合、以下の構文で行うことが出来ます。

目次

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さえ覚えておけば列名だけでも属性だけでも対応可能です。

慣れてきたら効率の良い書き方をマスターすればいいと思います。