:: DEVELOPER ZONE
ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification ...]
alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
| ADD [COLUMN] (create_definition, create_definition,...)
| ADD INDEX [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
| ADD FULLTEXT [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 create_definition
[FIRST | AFTER column_name]
| MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col
| CHARACTER SET character_set_name [COLLATE collation_name]
| table_options
ALTER TABLE では、既存のテーブルの構造を変更することができます。
たとえば、カラムの追加や削除、インデックスの作成や破壊、既存のカラムの型変更、カラム名やテーブル名自体の変更などの操作を実行できます。また、テーブルおよびテーブル型に関するコメントを変更することもできます。
See 項6.5.3. 「CREATE TABLE 構文」。
ALTER TABLE を使用してカラムの仕様を変更したにもかかわらず、カラムが変更されていないと DESCRIBE tbl_name で示された場合は、項6.5.3.1. 「カラムの暗黙的な変更」 で挙げている理由のいずれかにより、変更が MySQL によって無視された可能性があります。たとえば、VARCHAR 型のカラムを CHAR 型に変更しようとしたときに、他の可変長カラムがテーブルにまだ含まれていると、このカラムに対しては VARCHAR 型が引き続き使用されます。
ALTER TABLE の処理では、元のテーブルの一時的なコピーが作成されます。
変更はこのコピーに対して実行されます。その後元のテーブルが削除され、新しいテーブルの名前が変更されます。この変更処理は、すべての更新が、エラーになることなく、確実に新しいテーブルに自動でリダイレクトされるように実行されます。ALTER TABLE の実行中、元のテーブルは他のクライアントによって読み取り可能です。このテーブルの更新とテーブルへの書き込みは、新しいテーブルの準備が整うまで停止されます。
注意: RENAME 以外のオプションを ALTER TABLE に指定した場合は、厳密にはデータをコピーする必要がないとき(カラム名の変更時など)でも、必ずテンポラリテーブルが MySQL によって作成されます。これについては今後修正する予定ですが、通常 ALTER TABLE はそれほど頻繁に使用されないため、TODOリストにおけるこの修正の優先順位はそれほど高くありません。
MyISAM テーブルについては、myisam_sort_buffer_size 変数に高い値を設定することによって、インデックスの再作成部分(再作成プロセスでもっとも処理が遅い部分)を迅速化することができます。
ALTER TABLE を使用するためには、対象のテーブルに対する ALTER、INSERT、CREATE の各権限が必要。
IGNORE は SQL-92 に対する MySQL の拡張。
IGNORE では、重複するユニークキーが新しいテーブルに存在する場合の ALTER TABLE の動作が制御される。
IGNORE を指定しない場合は、コピー処理が中断され、ロールバックされる。
IGNORE を指定すると、重複するユニークキーを持つレコードがある場合、最初のレコードのみが使用され、その他のレコードが削除される。
1 つの ALTER TABLE ステートメントで、複数の ADD、ALTER、DROP、CHANGE 節を発行できる。これは SQL-92 に対する MySQL の拡張。SQL-92 では、1 つの ALTER TABLE ステートメントでこれらのいずれか 1 つの節しか使用できない。
CHANGE col_name, DROP col_name と DROP INDEX は SQL-92 に対する MySQL の拡張。
MODIFY は ALTER TABLE に対する Oracle の拡張。
オプションの語 COLUMN は純粋なノイズワードであり、省略可能。
その他のオプションを指定しないで ALTER TABLE tbl_name RENAME TO new_name を使用すると、単にテーブル tbl_name に対応するファイルの名前が MySQL によって変更される。テンポラリテーブルを作成する必要はない。
See 項6.5.5. 「RENAME TABLE 構文」。
create_definition 節では、ADD および CHANGE 用に CREATE TABLE と同じ構文が使用される。注意: この構文には、カラム型だけでなく、カラム名が含まれる。
See 項6.5.3. 「CREATE TABLE 構文」。
カラム名の変更には、CHANGE old_col_name create_definition 節を使用できる。この変更を行うには、元のカラム名と新しいカラム名を指定し、さらに現在のこのカラムの型を指定する。たとえば、INTEGER 型のカラム a の名前を b に変更するには、次のようにする。
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
CHANGE 構文では、カラムの名前ではなく型を変更する場合にも、元のカラム名と新しいカラム名の両方を(たとえ同じであっても)指定する必要がある。
次に例を示す。
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
ただし、MySQL バージョン 3.22.16a 以降では、MODIFY を使用することで、カラムの名前を変更することなく、カラムの型変更を実行できる。
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
カラムの一部に関するインデックスがある場合(たとえば、VARCHAR 型カラムの最初の 10 文字のインデックスがある場合など)、CHANGE または MODIFY を使用してそのカラムを短縮するときには、カラムの長さを、インデックスが作成されている文字の数より短くすることはできない。
CHANGE または MODIFY を使用してカラムの型を変更する際には、MySQL によって、新しい型へのデータの変換ができる限り実行される。
MySQL バージョン 3.22 以降では、FIRST または ADD ... AFTER col_name を使用して、テーブルレコード内の特定の位置にカラムを追加することができる。デフォルトでは、レコードの最後にカラムが追加される。
MySQL バージョン 4.0.1 以降では、CHANGE や MODIFY でも、FIRST および AFTER キーワードを使用できる。
ALTER COLUMN では、カラムの新しいデフォルト値を指定するか、または以前のデフォルト値を削除できる。
以前のデフォルトを削除した場合、そのカラムで NULL の格納が可能なら、新しいデフォルト値は NULL になる。そのカラムで NULL の格納が不可能な場合は、項6.5.3. 「CREATE TABLE 構文」 で説明しているデフォルト値が MySQL によって割り当てられる。
DROP INDEX では、インデックスが削除される。これは、SQL-92 に対する MySQL の拡張。See 項6.5.8. 「DROP INDEX 構文」。
カラムがテーブルから破棄された場合、そのカラムは構成要素となっているすべてのインデックスからも削除される。インデックスを構成するすべてのカラムが破棄された場合は、そのインデックス自体も破棄される。
テーブルにカラムが 1 つしか含まれない場合、そのカラムを破棄することはできない。
テーブルの削除を実行することが目的である場合は、カラムを破棄するのではなく、DROP TABLE を実行する。
DROP PRIMARY KEY では、プライマリインデックスが破棄される。プライマリインデックスが存在しない場合は、そのテーブルの最初の UNIQUE インデックスが破棄される(明示的に指定された PRIMARY KEY がまったく存在しない場合は、MySQL によって、最初の UNIQUE キーが PRIMARY KEY としてマークされる)。
テーブルに UNIQUE INDEX または PRIMARY KEY を追加すると、その値は非 UNIQUE なあらゆるインデックスの前に格納される。これは、MySQL で重複キーをできる限り迅速に検出できるようにするためである。
ORDER BY では、レコードを特定の順序で並べた新しいテーブルを作成できる。注意: 挿入や削除を行った後は、テーブル内の元の順序は維持されない。場合によっては、後でテーブル内の順序付けの基準とするカラムに基づいて、テーブル内の順序を設定しておくと、MySQL でのソートがより容易化されることがある。このオプションは主に、レコードのクエリをたいてい特定の順序で行うことが明らかな場合に役立つ。テーブルを大幅に変更した後にこのオプションを使用することによって、パフォーマンスが良くなる場合がある。
MyISAM テーブルに対して ALTER TABLE を使用すると、非ユニークなインデックスのすべてが別のバッチに作成される(REPAIR の場合と同様)。
インデックスが数多くある場合は、これによって ALTER TABLE の処理がはるかに迅速化される。
MySQL 4.0 以降では、上記の機能を明示的に有効化することができる。
そのためには、ALTER TABLE ... DISABLE KEYS によって、MySQL による MyISAM テーブルの非ユニークなインデックスの更新を停止する。
その後、ALTER TABLE ... ENABLE KEYS によって、欠落しているインデックスを再作成する。MySQL において、この処理は 1 つずつキーを挿入する処理よりはるかに早い特殊アルゴリズムを使用して実行されるため、大量の挿入ではキーを無効化することによって処理が大幅に迅速化される。
C API 関数 mysql_info() を使用すると、コピーされたレコードの数と、ユニークキー値の重複により削除されたレコードの数(IGNORE を指定した場合)を確認できる。
... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...) と ... DROP FOREIGN KEY ... をサポートしている InnoDB 型のテーブルを対象としている場合を除いて、FOREIGN KEY、CHECK、REFERENCES の各節では実際には何も行われない。
See 項7.5.5.2. 「FOREIGN KEY 制約」。
他のテーブル型に関しては、この構文は互換性を確保する目的で提供されている。つまり、他の SQL サーバにコードを移植し、参照を含むテーブルを作成するアプリケーションを実行しやすくするためである。
See 項1.8.4. 「MySQL と SQL-92 との違い」。
ALTER TABLE では、テーブルオプション DATA DIRECTORY と INDEX DIRECTORY は無視される。
CHAR 型、VARCHAR 型、TEXT 型のすべてのカラムを新しいキャラクタセットに変更するには(たとえば、MySQL 4.0.x から 4.1.1 にアップグレードした後などに)、次のようにする。
ALTER TABLE table_name CHARACTER SET character_set_name;
注意: 次のコマンドでは、テーブルの default character set しか変更されない。
ALTER TABLE table_name DEFAULT CHARACTER SET character_set_name;
default character set とは、テーブルに追加する(ALTER TABLE ... ADD column などで)新しいカラムに対してキャラクタセットを指定しなかった場合に使用されるキャラクタセット。
以下に、ALTER TABLE に使用例をいくつか示します。まず、次のコマンドでテーブル t1 を作成するとします。
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
このテーブルの名前を t1 から t2 に変更するには、次のようにします。
mysql> ALTER TABLE t1 RENAME t2;
カラム a を INTEGER から TINYINT NOT NULL に変更し(名前は変えずに)、さらにカラム b を CHAR(10) から CHAR(20) に変更し、かつこのカラムの名前を b から c に変更するには、次のようにします。
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
d という名前を持つ TIMESTAMP 型の新しいカラムを追加するには、次のようにします。
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
カラム d にインデックスを追加し、カラム a を主キーにするには、次のようにします。
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
カラム c を削除するには、次のようにします。
mysql> ALTER TABLE t2 DROP COLUMN c;
c という名前を持つ、整数型の新しい AUTO_INCREMENT カラムを追加するには、次のようにします。
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
注意: 上の例で c のインデックスを作成しているのは、AUTO_INCREMENT カラムにはインデックスが必要なためです。また、c を NOT NULL として宣言しているのは、インデックス付きカラムは値として NULL を取れないためです。
AUTO_INCREMENT カラムを追加すると、カラム値として連続番号が自動的に挿入されます。最初の連続番号を設定するには、ALTER TABLE の前に SET INSERT_ID=value を実行するか、または AUTO_INCREMENT=value テーブルオプションを指定します。
See 項5.5.6. 「SET 構文」。
MyISAM テーブルでは、AUTO_INCREMENT カラムを変更しない限り、連続番号は影響されません。AUTO_INCREMENT カラムを破棄した後に別の AUTO_INCREMENT カラムを追加すると、再び 1 から採番されます。
© 1995-2005 MySQL AB. All rights reserved.
