ページ

2012/11/24

[SQLearning][MySQL]テーブルの変更・削除

SQL ゼロからはじめるデータベース操作を教材にしてMySQLを学ぶ
SQL学習連載「SQLearning」の第4回です。
前回: [SQLearning][MySQL]データ型・制約の指定 | DevAchieve
第4回は「テーブルの変更・削除」についてです。

カラムの追加

前回同様、以下のテーブルを元に解説していきます。
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(255) | NO   | UNI | NULL    |                |
| description | text         | YES  |     | NULL    |                |
| price       | int(11)      | NO   |     | NULL    |                |
| tax_free    | tinyint(1)   | NO   |     | 0       |                |
| reg_date    | datetime     | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
このテーブルにカラムを追加するには以下のように記述します。
ALTER TABLE <テーブル名> ADD <追加するカラム名> <型> <制約>;
ALTER TABLE products
    ADD bar_code varchar(255) NOT NULL DEFAULT '0-000000-000000' AFTER tax_free;
カラムの追加位置は AFTER で指定します。未指定の場合は末尾に追加されます。
先頭に追加する場合は以下のように FIRST で指定します。
ALTER TABLE products
    ADD products_type_id int(11) NOT NULL DEFAULT 0 COMMENT '商品タイプ' FIRST;
また、複数追加する場合は以下のようにカンマ区切りで記述します。
ALTER TABLE products
    ADD receipt_name varchar(255) NOT NULL COMMENT 'レシート表示名' AFTER name,
    ADD url varchar(255) NULL DEFAULT NULL COMMENT '商品ページURL' AFTER description;

カラムの変更

カラム名、カラムの型や制約を変更する場合は以下のように記述します。
ALTER TABLE <テーブル名> CHANGE <古いカラム名> <新しいカラム名> <型> <制約>;
ALTER TABLE products
    CHANGE url homepage_url varchar(255) NULL DEFAULT NULL COMMENT '商品ホームページURL';

カラムの型や制約だけを変更したい場合は以下のように記述します。
ALTER TABLE <テーブル名> MODIFY <変更するカラム名> <型> <制約>;
ALTER TABLE products
    MODIFY bar_code varchar(13) NOT NULL DEFAULT '0000000000000' AFTER id;
AFTER でカラムの順番も変更することもできます。
Oracleの独自実装の互換性対応のため実装されているようです。

カラムのデフォルト値を削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> DROP DEFAULT;
ALTER TABLE products
    ALTER bar_code DROP DEFAULT;

カラムのデフォルト値を設定したい場合は以下のように記述します。
ALTER TABLE <テーブル名> ALTER <カラム名> SET DEFAULT <デフォルト値>;
ALTER TABLE products
    ALTER bar_code SET DEFAULT '0000000000000';

カラムの削除

カラムを削除したい場合は以下のように記述します。
ALTER TABLE <テーブル名> DROP <削除するカラム名>;
ALTER TABLE products
    DROP homepage_url;

ADD, ALTER, CHANGE, DROP はカンマで区切ることによって一度に複数の変更を実行することができます。
ALTER TABLE では元テーブルの一時コピーを作成するため一度に変更を実行したほうが良いです。
ほとんどの場合、 ALTER TABLE は元テーブルのテンポラリ コピーを作成する事で起動します。
そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。
ALTER TABLE が実行している間、他のクライアントが元テーブルを読む事ができます。
新しいテーブルの準備ができるまで更新と書き込みは止められ、
その後更新に失敗する事なく新しいテーブルに自動的にリダイレクトされます。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

AUTO_INCREMENT の値の変更

以下のように記述します。
ALTER TABLE <テーブル名> AUTO_INCREMENT = <値>;
ALTER TABLE products AUTO_INCREMENT = 100;
AUTO_INCREMENT カラム内の最高値以下の値が指定された場合、
MyISAMでは最高値+1にリセットされますが、InnoDBではエラーも出ず、変更もされません。

おまけ: AUTO_INCREMENT の振り直し

挿入と削除を繰り返していると id が歯抜け状態になるので振り直したい時に使えます。
データ不整合を起こす可能性があるのでよく検討してから使用してください。
ALTER TABLE products
    CHANGE id renamed_id int(11);
ALTER TABLE products
    ADD id int(11) NOT NULL AUTO_INCREMENT FIRST,
    ADD PRIMARY KEY(id),
    DROP renamed_id;
単純に id を DROP してから追加しないのは先に DROP すると順序が変わる可能性があるからです。

テーブル名の変更

ALTER TABLE <テーブル名> RENAME TO <新しいテーブル名>
RENAME TABLE <テーブル名> TO <新しいテーブル名>
標準SQLでテーブル名の変更が定義されていないので独自実装で方法が幾つかあります。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.19 RENAME TABLE 構文

データベースエンジンの変更

ALTER TABLE <テーブル名> ENGINE = <エンジン名>;
ALTER TABLE products ENGINE = InnoDB;

デフォルト文字セットの変更

ALTER TABLE <テーブル名> DEFAULT CHARSET = <文字コード名>;

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

テーブルの削除

DROP TABLE [IF EXISTS] <テーブル名>;
DROP TABLE products;
DROP TABLE IF EXISTS products;
IF EXISTS を記述すれば存在しないテーブルの削除を試みることによるエラーを防ぐことができます。

次回

次回は「SELECT文の基礎」について予定しています。
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作 (CD-ROM付) (プログラミング学習シリーズ)