ALTER TABLE 構文

ALTER [IGNORE] TABLE tbl_name
    alter_specification [, alter_specification] ...

alter_specification:
    table_option ...
  | ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
  | ADD [COLUMN] (column_definition,...)
  | ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
        PRIMARY KEY [index_type] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
        UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)
  | ADD FULLTEXT [INDEX|KEY] [index_name] (index_col_name,...)
      [WITH PARSER parser_name]
  | ADD SPATIAL [INDEX|KEY] [index_name] (index_col_name,...)
  | ADD [CONSTRAINT [symbol]]
        FOREIGN KEY [index_name] (index_col_name,...)
        [reference_definition]
  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  | CHANGE [COLUMN] old_col_name column_definition
        [FIRST|AFTER col_name]
  | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
  | DROP [COLUMN] col_name
  | DROP PRIMARY KEY
  | DROP {INDEX|KEY} index_name
  | DROP FOREIGN KEY fk_symbol
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] new_tbl_name
  | ORDER BY col_name [, col_name] ...
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
  | DISCARD TABLESPACE
  | IMPORT TABLESPACE
  | PARTITION BY partition_options
  | ADD PARTITION (partition_definition)
  | DROP PARTITION partition_names
  | COALESCE PARTITION number
  | REORGANIZE PARTITION partition_names INTO (partition_definitions)
  | ANALYZE PARTITION partition_names
  | CHECK PARTITION partition_names
  | OPTIMIZE PARTITION partition_names
  | REBUILD PARTITION partition_names
  | REPAIR PARTITION partition_names
  | REMOVE PARTITIONING

index_col_name:
    col_name [(length)] [ASC | DESC]

index_type:
    USING {BTREE | HASH}

ALTER TABLE で既存テーブルの構造を変更する事ができます。例えば、カラムの追加や削除、インデックスの作成や破壊、既存カラム タイプの変更、またはカラムやテーブル自体の名前の変更をする事ができます。テーブルや、テーブル タイプのコメントを変更する事もできます。

多くの許容される変更の構文は、CREATE TABLE ステートメントの条項に似ています。詳細については、項 「CREATE TABLE 構文」 をご参照ください。

ストレージ エンジンがその操作をサポートしていないテーブルに対しては、いくつかの操作の結果は警告になってしまうかもしれません。これらの警告は SHOW WARNINGS で表示する事ができます。詳しくは 項31. 「SHOW WARNINGS 構文」 を参照してください。

ほとんどの場合、 ALTER TABLE は元テーブルのテンポラリ コピーを作成する事で起動します。そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。ALTER TABLE が実行している間、他のクライアントが元テーブルを読む事ができます。新しいテーブルの準備ができるまで更新と書き込みは止められ、その後更新に失敗する事なく新しいテーブルに自動的にリダイレクトされます。

テンポラリ テーブルが必要ない場合がいくつかあります。

そうでない場合は、そのデータが必ずコピーされる必要がある訳ではなくても、MySQL がテンポラリ テーブルを作成します。 (カラム名を変更した時と同じように)MyISAM テーブルは、高い値に myisam_sort_buffer_size システム変数を設定する事で、インデックスの再作成操作のスピードを上げる事ができます。 (これは変更プロセスの中で一番遅い操作です。)

mysql_info() C API 機能を利用すると、いくつの行がコピーされ、(IGNORE が利用された時) いくつの行がユニークキー値の複製の為に削除されたのかを確認する事ができます。詳しくは 項35. 「mysql_info()」 を参照してください。

ALTER TABLE の利用方法を表すいくつかの例があります。ここに表されているように作成された、テーブル t1 から始めましょう。

CREATE TABLE t1 (a INTEGER,b CHAR(10));

t1 から t2 のテーブルの名前を付けるには

ALTER TABLE t1 RENAME t2;

カラム aINTEGER から TINYINT NOT NULL (同じ名前のまま)に変更する為に、そしてカラム b を、b から c に変更するのと同じように、CHAR(10) から CHAR(20) に変更する為には:

ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

d と名づけられた新しい TIMESTAMP カラムを追加する為には:

ALTER TABLE t2 ADD d TIMESTAMP;

カラム d とカラム a にインデックスを追加する為には:

ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a);

カラム c を取り除く為には:

ALTER TABLE t2 DROP COLUMN c;

c と名づけられた新しい AUTO_INCREMENT カラムを追加する為には:

ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (c);

AUTO_INCREMENT カラムはインデックスされなければいけない為、c (PRIMARY KEY として)をインデックスした、そして、主キー カラムは NULL になり得ない為 cNOT NULL として宣言したという事を覚えておいて下さい。

AUTO_INCREMENT カラムを追加する時、カラム値はシーケンス番号で自動的にファイルされます。MyISAM テーブルには、ALTER TABLE の前に SET INSERT_ID=value を実行する事、またはAUTO_INCREMENT=value テーブルオプションを利用する事により最初のシーケンス番号を設定する事ができます。詳しくは 項 「SET 構文」 を参照してください。

MyISAM テーブルを利用すると、AUTO_INCREMENT カラムを変更しなければ、シーケンス番号は影響を受けません。もし AUTO_INCREMENT カラムをドロップし、そして別の AUTO_INCREMENT カラムを追加すると、番号は1から始まる順番に並べ直されます。

レプリケーションが利用された時、テーブルに AUTO_INCREMENT カラムを追加してもスレーブとマスターの行は同じ順番にはならないでしょう。これは、行の番号付けがテーブルに利用される特別なストレージ エンジンと、行が挿入される順番によって決まる為に起こります。もしマスターとスレーブ上で同じ順番である事が重要であれば、AUTO_INCREMENT 番号を割り当てる前に行の順番を整えておく必要があります。テーブル t1AUTO_INCREMENT カラムを追加したいと仮定して、次のステートメントは t1 と同一の AUTO_INCREMENT カラムを持つ新しいテーブル t2 を作成します。

CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY) 
SELECT * FROM t1 ORDER BY col1, col2;

これは、テーブル t1 はカラム col1col2 を持つと仮定します。

このステートメント セットはまた、t1 と同一の AUTO_INCREMENT カラムを追加した

新しいテーブル t2 を作成します。

CREATE TABLE t2 LIKE t1;
ALTER TABLE T2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;

重要:マスターとスレーブ上で同じ順番である事を保障する為に、t1全てのカラムは ORDER BY 条項内で参照を付けられる必要があります。

AUTO_INCREMENT カラムを持つコピーを作成、実装する為に利用した方法に関わらず、最後のステップは元テーブルをドロップし、コピーをリネームする事です。

DROP t1;
ALTER TABLE t2 RENAME t1;

項B. 「Problems with ALTER TABLE」 も参照してください。