CREATE TABLE文でテーブルを作成した後で、新しい列を追加したり、列名を変更したりしたいことがあります。このようにテーブル定義を変更したい場合、データが1件も格納されていなければ、テーブルを削除して、再度、作り直せば良いわけですが、既にデータが格納されている場合はそうはいきません。

MySQLでは、ALTER TABLE文が用意されており、既存のデータに影響を与えることなく、テーブル定義を変更することが可能です。ALTER TABLE文では、列の追加や削除、インデックスの作成や削除、既存の列のデータ型変更、列名やテーブル名の変更などが行えます。

ALTER TABLE基本構文
ALTER TABLE <テーブル名> <ALTER指定>

「ALTER指定」には以下のような指定が可能です。

キーワード説明
ADD [COLUMN] 列名 データ型 [FIRST | AFTER 列名]列を追加する。「FIRST」を指定するとテーブルの最初に、「AFTER 列名」を指定するとその列の後ろに追加する。デフォルトではテーブルの最後に追加する。
CHANGE [COLUMN] 列名 新列名 新データ型列の定義を変更する。列名またはデータ型、あるいはその両方を変更できる。
MODIFY [COLUMN] 列名 新データ型列のデータ型を変更する。
DROP [COLUMN] 列名列を削除する。

※COLUMNは省略可能。

実際にALTER TABLE文を用いてテーブル定義を変更してみます。

> ALTER TABLE stuff ADD COLUMN age INT;

この例では、「stuff」テーブルにINT型の「age」列を追加しています。変更されたことを確認するには、テーブル定義の詳細を表示するDESCコマンドを使用します。

> DESC stuff;
+-------------+---------+------+-----+---------+-------+
| Field       | Type    | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| name        | text    | YES  |     | NULL    |       |
| description | text    | YES  |     | NULL    |       |
| age         | int(11) | YES  |     | NULL    |       |
+-------------+---------+------+-----+---------+-------+

では、列を追加した直後、その列には何の値が格納されているのでしょうか。それをSELECT文で確かめてみます。

> SELECT * FROM stuff;
+----------+--------------------------+------+
| name     | description              | age  |
+----------+--------------------------+------+
| 大崎     | 会長                     | NULL |
| 岡本     | 社長                     | NULL |
| 松本     | ダウンタウン、浜田の相方 | NULL |
| 加藤     | スッキリ                 | NULL |
+----------+--------------------------+------+

追加した「age」列にはNULLが格納されていることがわかります。NULLは「何もない」ことを示す特殊な値です。

UPDATE文を使用して、値を入れておきましょう。

> UPDATE stuff SET age = 66 WHERE name = '大崎';
> UPDATE stuff SET age = 53 WHERE name = '岡本';
> UPDATE stuff SET age = 55 WHERE name = '松本';