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 = '松本';
