First Creation 2005/02/13
Last Update 2007/02/06
Bloody Mary > Technical Notes > MySQL テーブル変更編

MySQL テーブル変更編

テーブルの変更とは、 Field 情報を追加・変更・削除することだ。Field の情報を変更する場合、既に入力されたデータの値が変更されることがあるので注意が必要だ。

あと、テーブルの名前も変更できる。

下準備

話を単純にするために、テーブルを作って、データを投入し、そこから Field 情報を変更してみよう。

mysql> CREATE TABLE cocktail (\
    id INT(5) UNSIGNED AUTO_INCREMENT NOT NULL,\
    name VARCHAR(20) NOT NULL,\
    base VARCHAR(20),\
    source VARCHAR(100) NOT NULL,\
    PRIMARY KEY(id)\
);
Query OK, 0 rows affected (0.13 sec)

mysql> INSERT INTO cocktail VALUES(NULL, 'Bloody Mary', 'Vodka', 'Vodka 45ml, some Tomato Juice');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO cocktail VALUES(NULL, 'Shandy Gaff', 'Beer', 'Beer Beer 50%, Ginger ale 50%');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO cocktail VALUES(NULL, 'Mimosa', 'Champagne', 'Champagne 50%, Orange Juice 50%');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO cocktail VALUES(NULL, 'Gin Tonic', 'Gin', 'Gin 45ml, some Tonic Water');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM cocktail;
+----+-------------+-----------+---------------------------------+
| id | name        | base      | source                          |
+----+-------------+-----------+---------------------------------+
|  1 | Bloody Mary | Vodka     | Vodka 45ml, some Tomato Juice   |
|  2 | Shandy Gaff | Beer      | Beer Beer 50%, Ginger ale 50%   |
|  3 | Mimosa      | Champagne | Champagne 50%, Orange Juice 50% |
|  4 | Gin Tonic   | Gin       | Gin 45ml, some Tonic Water      |
+----+-------------+-----------+---------------------------------+
4 rows in set (0.00 sec)

テーブル情報の変更

Field 情報の追加

さて、準備が整ったところで、 Field を追加してみよう。country というフィールドを追加することにする。どこの国で作られたかを示す Field だ。

mysql> ALTER TABLE cocktail ADD country VARCHAR(30) Default 'Unknown' AFTER base;
Query OK, 4 rows affected (0.20 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> DESCRIBE cocktail;
+---------+-----------------+------+-----+---------+----------------+
| Field   | Type            | Null | Key | Default | Extra          |
+---------+-----------------+------+-----+---------+----------------+
| id      | int(5) unsigned |      | PRI | NULL    | auto_increment |
| name    | varchar(20)     |      |     |         |                |
| base    | varchar(20)     | YES  |     | NULL    |                |
| country | varchar(30)     | YES  |     | Unknown |                |
| source  | varchar(100)    |      |     |         |                |
+---------+-----------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> SELECT * FROM cocktail;
+----+-------------+-----------+---------+---------------------------------+
| id | name        | base      | country | source                          |
+----+-------------+-----------+---------+---------------------------------+
|  1 | Bloody Mary | Vodka     | Unknown | Vodka 45ml, some Tomato Juice   |
|  2 | Shandy Gaff | Beer      | Unknown | Beer Beer 50%, Ginger ale 50%   |
|  3 | Mimosa      | Champagne | Unknown | Champagne 50%, Orange Juice 50% |
|  4 | Gin Tonic   | Gin       | Unknown | Gin 45ml, some Tonic Water      |
+----+-------------+-----------+---------+---------------------------------+
4 rows in set (0.00 sec)

ご覧の通り、追加された country は、デフォルト値 Unknown で、base というフィールドの後ろに追加されたのが確認できるだろう。

Field 情報の修正

先ほど追加した country Field の情報を修正しよう。VARCHAR(30) から VARCHAR(20) に、デフォルト値を Somewhere に修正する。

その前に、Mimosa の country を空にして、 Field 変更後、どのようなデータが入るのかを確認する。

mysql> UPDATE cocktail SET country = NULL WHERE id = 3;
Query OK, 1 row affected (0.49 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> ALTER TABLE cocktail MODIFY country VARCHAR(20) Default 'Anywhere' NOT NULL;
Query OK, 4 rows affected, 1 warning (6.01 sec)
Records: 4  Duplicates: 0  Warnings: 1

やけに時間がかかったので、一瞬フリーズしたかと思ったが、たまたまサーバが忙しかっただけのようだ。今回のコマンドが原因ではない。たかだか 4 件のデータしか入っていないのだし。これが数万件単位になると、話は変わってくるのだが、そんなデータベースの Field 情報は気軽に更新すべきではない。

1 warning になっているのは、先ほど NULL にした Mimosa のところだろう。

入力済みのデータにどう影響するか確認してみよう

mysql> DESCRIBE cocktail;
+---------+-----------------+------+-----+----------+----------------+
| Field   | Type            | Null | Key | Default  | Extra          |
+---------+-----------------+------+-----+----------+----------------+
| id      | int(5) unsigned |      | PRI | NULL     | auto_increment |
| name    | varchar(20)     |      |     |          |                |
| base    | varchar(20)     | YES  |     | NULL     |                |
| country | varchar(20)     | YES  |     | Anywhere |                |
| source  | varchar(100)    |      |     |          |                |
+---------+-----------------+------+-----+----------+----------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM cocktail;
+----+-------------+-----------+---------+---------------------------------+
| id | name        | base      | country | source                          |
+----+-------------+-----------+---------+---------------------------------+
|  1 | Bloody Mary | Vodka     | Unknown | Vodka 45ml, some Tomato Juice   |
|  2 | Shandy Gaff | Beer      | Unknown | Beer Beer 50%, Ginger ale 50%   |
|  3 | Mimosa      | Champagne |         | Champagne 50%, Orange Juice 50% |
|  4 | Gin Tonic   | Gin       | Unknown | Gin 45ml, some Tonic Water      |
+----+-------------+-----------+---------+---------------------------------+
4 rows in set (0.00 sec)

テーブル情報を DESCRIBE で見ると、country は varchar(20) になっているのが確認できる。

SELECT は・・・あれ、思い通りの動作にならないな。 id = 3 の country Field に、Anywhere と入ると思ったのだが。NOT NULL にしているのだが、どういうつもりだ。あとで確認しよう。

Field 情報の変更 2 - CHANGE

フィールド名を変更するなら CHANGE オプションだ。MODIFY は Field の名前を変更せず、データ型を変更する場合に便利で、 CHANGE は 型も名前も変更したいときに便利だ。

mysql> ALTER TABLE cocktail CHANGE country designer VARCHAR(50) DEFAULT 'Charlie';
Query OK, 4 rows affected (0.14 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> DESCRIBE cocktail;
+----------+-----------------+------+-----+---------+----------------+
| Field    | Type            | Null | Key | Default | Extra          |
+----------+-----------------+------+-----+---------+----------------+
| id       | int(5) unsigned |      | PRI | NULL    | auto_increment |
| name     | varchar(20)     |      |     |         |                |
| base     | varchar(20)     | YES  |     | NULL    |                |
| designer | varchar(50)     | YES  |     | Charlie |                |
| source   | varchar(100)    |      |     |         |                |
+----------+-----------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

mysql> SELECT * FROM cocktail;
+----+-------------+-----------+----------+---------------------------------+
| id | name        | base      | designer | source                          |
+----+-------------+-----------+----------+---------------------------------+
|  1 | Bloody Mary | Vodka     | Unknown  | Vodka 45ml, some Tomato Juice   |
|  2 | Shandy Gaff | Beer      | Unknown  | Beer Beer 50%, Ginger ale 50%   |
|  3 | Mimosa      | Champagne |          | Champagne 50%, Orange Juice 50% |
|  4 | Gin Tonic   | Gin       | Unknown  | Gin 45ml, some Tonic Water      |
+----+-------------+-----------+----------+---------------------------------+
4 rows in set (0.00 sec)

Field 情報の削除

designer は不要ということで。

mysql> ALTER TABLE cocktail DROP designer;
Query OK, 4 rows affected (0.09 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> DESCRIBE cocktail;
+--------+-----------------+------+-----+---------+----------------+
| Field  | Type            | Null | Key | Default | Extra          |
+--------+-----------------+------+-----+---------+----------------+
| id     | int(5) unsigned |      | PRI | NULL    | auto_increment |
| name   | varchar(20)     |      |     |         |                |
| base   | varchar(20)     | YES  |     | NULL    |                |
| source | varchar(100)    |      |     |         |                |
+--------+-----------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

designer Field はちゃんと消えている。

戻る 上へ 次へ