First Creation | 2005/02/13 |
---|---|
Last Update | 2007/02/06 |
テーブルの変更とは、 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 を追加してみよう。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 というフィールドの後ろに追加されたのが確認できるだろう。
先ほど追加した 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 にしているのだが、どういうつもりだ。あとで確認しよう。
フィールド名を変更するなら 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)
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 はちゃんと消えている。