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
から採番されます。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.