ALTER [IGNORE] TABLEtbl_name
alter_specification
[,alter_specification
] ...alter_specification
:table_option
... | ADD [COLUMN]column_definition
[FIRST | AFTERcol_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 PARSERparser_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 DEFAULTliteral
| DROP DEFAULT} | CHANGE [COLUMN]old_col_name
column_definition
[FIRST|AFTERcol_name
] | MODIFY [COLUMN]column_definition
[FIRST | AFTERcol_name
] | DROP [COLUMN]col_name
| DROP PRIMARY KEY | DROP {INDEX|KEY}index_name
| DROP FOREIGN KEYfk_symbol
| DISABLE KEYS | ENABLE KEYS | RENAME [TO]new_tbl_name
| ORDER BYcol_name
[,col_name
] ... | CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
] | [DEFAULT] CHARACTER SETcharset_name
[COLLATEcollation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE | PARTITION BYpartition_options
| ADD PARTITION (partition_definition
) | DROP PARTITIONpartition_names
| COALESCE PARTITIONnumber
| REORGANIZE PARTITIONpartition_names
INTO (partition_definitions
) | ANALYZE PARTITIONpartition_names
| CHECK PARTITIONpartition_names
| OPTIMIZE PARTITIONpartition_names
| REBUILD PARTITIONpartition_names
| REPAIR PARTITIONpartition_names
| REMOVE PARTITIONINGindex_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
が実行している間、他のクライアントが元テーブルを読む事ができます。新しいテーブルの準備ができるまで更新と書き込みは止められ、その後更新に失敗する事なく新しいテーブルに自動的にリダイレクトされます。
テンポラリ テーブルが必要ない場合がいくつかあります。
もし、他のオプション無しで ALTER TABLE tbl_name RENAME TO new_tbl_name
を利用すると、MySQLはテーブル tbl_name
に対応する全てのファイルをリネームします。(テーブルをリネームする為に RENAME TABLE
ステートメントを利用する事もできます。詳しくは 項 「RENAME TABLE
構文」 を参照してください。)リネームされたテーブルに与えられた権限は、新しい名前に移動しません。それらは手動で変更しなければいけません。
ALTER TABLE ...ADD PARTITION
はMySQLクラスタ以外にテンポラリテーブルを作成しません。RANGE
や LIST
パーティションの ADD
や DROP
操作は直接の操作、またはそれに近い操作です。HASH
や KEY
パーティションの ADD
や COALESCE
操作は変更されたパーティション間でデータをコピーします。 LINEAR HASH/KEY
が利用されていない限り、これは新しいテーブルを作成するのとほとんど変わりません。(操作はパーティションごとに行われますが。)REORGANIZE
操作は変更されたパーティションだけをコピーし、変更されていない物には関係しません。
そうでない場合は、そのデータが必ずコピーされる必要がある訳ではなくても、MySQL がテンポラリ テーブルを作成します。 (カラム名を変更した時と同じように)MyISAM
テーブルは、高い値に myisam_sort_buffer_size
システム変数を設定する事で、インデックスの再作成操作のスピードを上げる事ができます。 (これは変更プロセスの中で一番遅い操作です。)
ALTER TABLE
を利用するには、テーブルに ALTER
、INSERT
、そして CREATE
権限が必要です。
IGNORE
はスタンダード SQL の MySQL 拡張子です。これは、新しいテーブルのユニーク キーに複製があったり、ストリクト モードが有効時に警告が出たりした時に
ALTER TABLE
がどのように機能するかコントロールします。もし IGNORE
が指定されなければ、複製キー エラーが起きた時、コピーは異常終了し、元に戻されます。もし IGNORE
が指定されると、ユニーク キーに複製された行の、最初の行だけが使用され、それ以外の相反する行は削除されます。不正な値は、適合する許容値に一番近い値まで切り捨てられます。
table_option
は CREATE TABLE
ステートメントで利用する事ができる種類のテーブル オプションを意味します。(項 「CREATE TABLE
構文」 に全てのテーブル オプションがリストされています。)これは、 ENGINE
、AUTO_INCREMENT
、そして AVG_ROW_LENGTH
等のオプションを含んでいます。しかし、ALTER TABLE
は DATA DIRECTORY
と INDEX DIRECTORY
テーブル オプションを無視します。
例えば、テーブルが InnoDB
テーブルになるように変換するには、このステートメントを利用します。
ALTER TABLE t1 ENGINE = InnoDB;
MySQL 5.1.11 以降のバージョンでは、不注意なデータ ロスを防ぐ為に、テーブルのストレージ エンジンを MERGE
や BLACKHOLE
変更する時に ALTER TABLE
を利用する事はできません。
AUTO_INCREMENT
カウンターを新しい行で使用するように値を変える為には、これを行って下さい。
ALTER TABLE t2 AUTO_INCREMENT = value
;
既に使用されている値と同じ、またはそれ以下の値にカウンターをリセットする事はできません。MyISAM
では、AUTO_INCREMENT
カラム内の値が現在の最高値と同じかそれ以下の値なら、その値は現在の最高値プラス1にリセットされます。InnoDB
では、もしその値がカラム内の現在の最高値以下であれば、エラー メッセージは表示されず、現在のシーケンス値は変更されません。
単一 ALTER TABLE
ステートメントの中で、カンマで区切られた複数の ADD
、 ALTER
、DROP
、 そして CHANGE
条項を発行する事ができます。これは、1つの ALTER TABLE
ステートメントに対して1つの条項しか許可しない、スタンダード SQL の MySQL 拡張子です。例えば、単一ステートメントに複数のカラムをドロップするには、これを実行してください。
ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE col_name
、 DROP col_name
、そして DROP INDEX
はスタンダード SQL の MySQL 拡張子です。
MODIFY
は ALTER TABLE
のオラクル拡張子です。
COLUMN
という言葉は任意であり、省く事ができます。
column_definition
条項は CREATE TABLE
と同じように、 ADD
と CHANGE
に同じ構文を利用します。この構文は、データタイプだけでなく、カラム名も含むという事を覚えておいて下さい。詳しくは 項 「CREATE TABLE
構文」 を参照してください。
CHANGE old_col_name column_definition
条項を利用してカラムをリネームする事ができます。それを行うには、カラムの古い名前と新しい名前、そして現在そのカラムが持つタイプを指定してください。例えば、INTEGER
カラムを a
から b
にリネームするには、次の物を実行する事ができます。
ALTER TABLE t1 CHANGE a b INTEGER;
もしカラム名ではなくカラム タイプを変更したければ、 CHANGE
構文には、両方同じだとしても古いカラム名と新しいカラム名が必要です。例:
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
リネームせずにカラム タイプを変更するには、MODIFY
を利用する事もできます。
ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
インデックスを持つカラムを短くする為に CHANGE
や MODIFY
を利用し、その結果カラム長がインデックス長よりも短くなるなら、MySQL はインデックスを自動的に短くします。
CHANGE
や MODIFY
を利用してデータタイプを変更する時、MySQL は既存カラムを新しいタイプに可能な限り変換しようと試みます。
テーブル行の中の指定した場所にカラムを追加するには、FIRST
か AFTER col_name
を利用してください。デフォルトはカラムを最後に追加します。CHANGE
か MODIFY
操作の中で FIRST
と AFTER
を利用する事もできます。
ALTER ...SET DEFAULT
または ALTER ...DROP DEFAULT
はそれぞれ、カラムに新しいデフォルト値を指定したり、古いデフォルト値を削除したりします。もし古いデフォルトが削除されて、カラムが NULL
になり得るなら、新しいデフォルトは NULL
です。もしカラムが NULL
になり得ないなら、項 「データタイプデフォルト値」 に説明されているように、MySQLはデフォルト値を割り当てます。
DROP INDEX
はインデックスを削除します。これはスタンダード SQL の MySQL 拡張子です。詳しくは 項 「DROP INDEX
構文」 を参照してください。
もしカラムがテーブルからドロップされると、そのカラムが関わっている全てのインデックスからも削除されます。もし1つのインデックスを構成している全てのカラムがドロップされると、そのインデックスもドロップされます。
もしテーブルがカラムを1つだけ含んでいると、そのカラムはドロップできません。もしテーブルを削除したいのであれば、代わりに DROP TABLE
を利用してください。
DROP PRIMARY KEY
はプライマリ インデックスをドロップします。注意:MySQL の古いバージョンは、もしプライマリ インデックスが存在しなければ、DROP PRIMARY KEY
はテーブルの中の最初の UNIQUE
インデックスをドロップします。これは、主キーがエラーにならないテーブルに DROP PRIMARY KEY
を利用しようとしている MySQL 5.1 では起こりません。
もし UNIQUE INDEX
か PRIMARY KEY
がテーブルに追加されると、MySQL が重複キーをなるべく早く見つけられるように、非ユニーク インデックスの前に格納されます。
いくつかのストレージ エンジンでは、インデックスを作成する時にタイプを指定する事ができます。index_type
指定子の構文は USING type_name
です。MySQL 5.1.10 以前では、USING
はインデックス カラム リストの前だけに与える事ができました。5.1.10 以降のバージョンでの望ましい位置は、カラム リストの後ろです。MySQL
5.3 以降は、カラム リストの前でのオプションの使用は見られません。
ORDER BY
で指定した順番の行で新しいテーブルを作成する事ができます。挿入と削除の後ではテーブルの順番が変わってしまう事を覚えておいて下さい。このオプションは、ほとんど毎回同じ順番で行のクエリを行う場合に便利です。テーブルに大きい変更を行った後にこのオプションを利用すると、高い性能を得る事が可能でしょう。テーブルが、後でカラムをオーダーしたい順番になっていれば、MySQL
のソートは簡単になる場合があります。
ORDER BY
構文は、ソートの昇順や降順を指示する為に、それぞれが任意で ASC
または DESC
が付随する1つか2つのカラム名を指定できます。デフォルトは昇順です。カラム名だけがソート基準として許されていて、任意の式は許されていません。
MyISAM
テーブル上でALTER TABLE
を利用すると、別のバッチに全ての非ユニークインデックスが作成されます。 ( REPAIR TABLE
に関して)多くのインデックスがある時は、この方法で ALTER TABLE
が大変早くなります。
この特徴は明確に起動する事ができます。ALTER TABLE ... DISABLE KEYS
は MySQL に MyISAM
テーブルの非ユニーク インデックスの更新を停めるよう命令します。ALTER TABLE ...
その時は、欠けているインデックスを再作成する為に ALTER TABLE ...ENABLE KEYS
を利用する必要があります。MySQL は、キーを1つ1つ挿入するよりも大変早い特別なアルゴリズムを利用してこの作業を行いますので、大量挿入を行う前にキーを無効化しておく事でかなりのスピードアップを実現する事ができます。ALTER TABLE ...
の利用ALTER TABLE ...DISABLE KEYS
の利用は、先に触れられた権限に加え、INDEX
権限を必要とします。
ENABLE KEYS
と DISABLE KEYS
は、MySQL 5.1.11 以前では分割されたテーブルに対してはサポートされていませんでした。(バグ #19502)
FOREIGN KEY
と REFERENCES
条項は、ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...)
を施行する InnoDB
ストレージ エンジンにサポートされています。詳しくは 項4. 「FOREIGN KEY
制約」 を参照してください。その他のストレージ エンジンでは、条項は解析されますが、無視されます。CHECK
条項は、全てのストレージ エンジンに解析されますが、無視されます。詳しくは 項 「CREATE TABLE
構文」 を参照してください。構文を受け入れながらも無視するのは、別のSQLサーバからコードをポートし易くし、参照を利用してテーブルを作成するアプリケーションを起動させるという、互換性の為です。詳しくは
項 「MySQLと標準SQLとの違い」 を参照してください。
単一 ALTER TABLE
ステートメントの別々の条項の中に外部キーを追加したりドロップしたりはできません。別々のステートメントを利用しなければいけません。
InnoDB
は外部キーをドロップする為の ALTER TABLE
の利用をサポートします。
ALTER TABLEtbl_name
DROP FOREIGN KEYfk_symbol
;
単一 ALTER TABLE
ステートメントの別々の条項の中に外部キーを追加したりドロップしたりはできません。別々のステートメントを利用しなければいけません。
追加情報については を参照してください。項4. 「FOREIGN KEY
制約」
テーブルが書き込みロックされ、ALTER TABLE
がテーブル構造を変更するのに利用されると、保留中の INSERT DELAYED
ステートメントは失われてしまいます。
もしテーブルのデフォルト文字セットと全ての文字カラム(CHAR
、VARCHAR
、TEXT
)を新しい文字セットに変更したければ、このようなステートメントを利用してください。
ALTER TABLEtbl_name
CONVERT TO CHARACTER SETcharset_name
;
警告: 先行操作が文字セット間でカラム値の変換を行います。もし1つの文字セット内にカラムを持つが(latin1
等)、格納値は実際には別の互換性の無い文字セット(utf8
等) を利用しているという場合には、これは 必要ではありません。このような場合は、それぞれのカラムに対して次のような作業が必要になります。
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
BLOB
カラムへの、またはそれからの変換時には変換が起きない為、これが有効なのです。
CONVERT TO CHARACTER SET binary
を指定すると、CHAR
、VARCHAR
、そして TEXT
カラムはそれぞれが対応するバイナリ文字列タイプに変換されます。(BINARY
、 VARBINARY
、BLOB
)これは、そのカラムはそれ以上文字セットを持たなくなり、それに続く CONVERT TO
操作が適応されないという事を意味します。
テーブルの default 文字セットだけを変更するには、このステートメントを利用してください。
ALTER TABLEtbl_name
DEFAULT CHARACTER SETcharset_name
;
DEFAULT
という言葉は任意です。テーブルに追加する新しいカラムの文字セットを指定しなければ、デフォルトの文字セットがその時に利用される文字セットです。(例えば、ALTER TABLE ... ADD column
と共に)
.ibd
ファイルの中のテーブルスペースで作成された InnoDB
テーブルに対して、そのファイルは廃棄、またインポートする事ができます。.ibd
ファイルを廃棄する為には、このステートメントを利用してください。
ALTER TABLE tbl_name
DISCARD TABLESPACE;
これは現在の .ibd
ファイル削除しますので、まずバックアップがある事を確認してください。テーブルスペース ファイルが廃棄されている最中にテーブルにアクセスしようとすると、エラーが発生します。
.ibd
のバックアップ ファイルをインポートする為には、まずそれをデータベース ディレクトリにコピーし、そしてこのステートメントを発行してください。
ALTER TABLE tbl_name
IMPORT TABLESPACE;
項 「SELECT
構文」を参照してください。
MySQL 5.1.5では ALTER TABLE
の領域確保に関する拡張子がいくつか追加されました。これらは、領域確保されたテーブルと共に、再領域確保、追加、ドロップ、マージ、そしてパーティションの分割、また、領域確保のメンテナンスを行う為に利用する事ができます。
そのまま partition_options
条項を領域確保されたテーブル上で ALTER TABLE
と共に利用すると、partition_options
によって定義された領域確保スキームに従って、そのテーブルを再領域確保します。この条項は必ず PARTITION BY
で始まり、CREATE TABLE
の partition_options
条項に適応するのと同様で、同じ構文と別のルールが後に続きます。(さらに詳細な説明については 項 「CREATE TABLE
構文」 を参照してください。) また、まだ分割されていない既存テーブルの分割に利用する事もできます。例えば、この様に定義された(領域確保されていない)テーブルを見てください。
CREATE TABLE t1 ( id INT, year_col INT );
このテーブルは id
カラムを領域確保キーとして利用し、HASH
によって、このステートメントを用いて、8区画に分割する事ができます。
ALTER TABLE t1 PARTITION BY HASH(id) PARTITIONS 8;
ALTER TABLE ... PARTITION BY
ステートメントを利用して作成されたテーブルは、CREATE TABLE ... PARTITION BY
を利用して作成された物と同じルールに従わなければいけません。これは、領域確保制限でも説明されているように、テーブルが持っているであろう全てのユニークキー間(主キーを含む)の関係を管理するルール、そして分割式の中で利用されるカラムを含みます。領域確保キーとユニークキー分割数を指定する為の CREATE TABLE ... PARTITION BY
ルールは、 ALTER TABLE ... PARTITION BY
にも適応します。
ALTER TABLE ... PARTITION BY
は MySQL 5.1.6 から利用可能になりました。
ALTER TABLE ADD PARTITION
の partition_definition
条項は、同名のCREATE TABLE
ステートメント条項に対して同名の条項がするのと同じように、同じオプションをサポートします。(構文と説明に関しては 項 「CREATE TABLE
構文」 を参照してください。)ここに表示されているように、分割済のテーブルが作成されていると仮定します。
CREATE TABLE t1 ( id INT, year_col INT ) PARTITION BY RANGE (year_col) ( PARTITION p0 VALUES LESS THAN (1991), PARTITION p1 VALUES LESS THAN (1995), PARTITION p2 VALUES LESS THAN (1999) );
次のように、2002
以下の数値を格納する為にこのテーブルに新しいパーティション p3
を追加する事ができます。
ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));
1つ、または複数の RANGE
や LIST
分割をドロップする為に DROP PARTITION
を利用する事ができます。このステートメントは HASH
や KEY
パーティションと一緒に利用する事はできませんが、代わりに COALESCE PARTITION
を利用してください。(下記参照)partition_names
リストの中で名前が付けられた、ドロップされたパーティションに格納されたデータは全て廃棄されます。例えば、あらかじめ定義されたテーブル t1
を利用し、ここに表されているように p0
と p1
という名前が付いたパーティションをドロップする事ができます。
ALTER TABLE t1 DROP PARTITION p0, p1;
DROP PARTITION
は NDB Cluster
ストレージ エンジンを利用するテーブルと一緒には機能しない事を覚えて置いてください。項 「RANGE
と LIST
パーティションの管理」 と 項14.13. 「MySQL Cluster の既知の制限」 を参照して下さい。
ADD PARTITION
と DROP PARTITION
は現在 IF [NOT] EXISTS
をサポートしていません。パーティションや分割されたテーブルをリネームする事も不可能です。その代わりに、もしパーティションをリネームしたいのであれば、パーティションをドロップして再作成する必要があります。そしてもし分割済テーブルをリネームしたければ、全てのパーティションをドロップし、テーブルをリネームし、そしてドロップされたパーティションをもう一度追加する必要があります。
数字
でパーティション数を減らす為に HASH
か KEY
で分割されたテーブルと一緒に COALESCE PARTITION
を利用する事ができます。次の定義を利用して t2
テーブルを作成したと仮定してください。
CREATE TABLE t2 ( name VARCHAR (30), started DATE ) PARTITION BY HASH( YEAR(started) ) PARTITIONS 6;
次のステートメントを利用して t2
で利用されたパーティション数を6から4に減らす事ができます。
ALTER TABLE t2 COALESCE PARTITION 2;
最後の number
パーティションに含まれているデータは、残りのパーティションにマージする事ができます。この場合、パーティション4と5は、最初の4つのパーティションにマージされます。(パーティション0、1、2、そして3)
分割されたテーブルで利用されたパーティションのいくつかを変更するには、REORGANIZE PARTITION
を利用する事ができます。このステートメントの利用方法はいくつかあります:
いくつかのセットになったパーティションを単一パーティションにマージする。この方法は、いくつかのパーティションに partition_names
リストの中で名前をつけ、 partition_definition
に1つの定義を付ける事で行う事ができます。
1つの既存パーティションをいくつかのパーティションに分割する。これは、単一パーティションに partition_names
で名前をつけ、いくつかの partition_definitions
を与える事で実行できます。
VALUES LESS THAN
を利用して定義されたパーティションのサブセットの範囲、または VALUES IN
を利用して定義されたパーティションのサブセットの値リストを変更する。
注意:明確に名前が付けられていないパーティションに対しては、MySQL は自動的にp0
、 p1
、 p2
、などのようなデフォルト名を付けます。MySQL 5.1.7 以降のバージョンでは、サブ パーティションに関しても同じ事が言えます。
ALTER TABLE ... REORGANIZE PARTITION
ステートメントに関する詳細情報と例に関しては、 項15.3. 「パーティショニング管理」 を参照してください。
いくつかの追加条項は、パーティションのメンテナンスと修復機能に似た物を、CHECK TABLE
や REPAIR TABLE
(分割されたテーブルにはサポートされて いない物 ) などの様なステートメントを利用して、分割されていないテーブルに提供します。これらには、ANALYZE PARTITION
、 CHECK PARTITION
、 OPTIMIZE PARTITION
、REBUILD PARTITION
、そして REPAIR PARTITION
が含まれます。これらのオプションのそれぞれは、カンマで区切られた1つか複数のパーティション名で構成される partition_names
条項を利用します。パーティションは変更されるテーブルの中に既に存在していなければいけません。これらについての更なる情報や例については、 項 「パーティションのメンテナンス」 を参照してください。
テーブルや、そのデータに影響を与える事無くテーブルの分割を除去できるようにする為、MySQL 5.1.8 で REMOVE PARTITIONING
が導入されました。(以前は ENGINE
オプションを利用して行われていました。)このオプションは、追加、ドロップ、ドロップ カラムやインデックスをリネームする為に利用されるような、ALTER TABLE
オプションと組み合わせる事ができます。
MySQL 5.1.7 以前のバージョンでは、ENGINE
オプションを ALTER TABLE
と一緒に利用すると、テーブルが削除されてしまう可能性がある領域確保の原因になりました。MySQL5.1.8 からは、このオプションによる、テーブルに利用されるストレージ
エンジンの変更はほとんど無く、領域確保にも全く影響を与えません。
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;
カラム a
を INTEGER
から 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
になり得ない為 c
を NOT 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
番号を割り当てる前に行の順番を整えておく必要があります。テーブル t1
に AUTO_INCREMENT
カラムを追加したいと仮定して、次のステートメントは t1
と同一の AUTO_INCREMENT
カラムを持つ新しいテーブル t2
を作成します。
CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY) SELECT * FROM t1 ORDER BY col1, col2;
これは、テーブル t1
はカラム col1
と col2
を持つと仮定します。
このステートメント セットはまた、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
」 も参照してください。