ALTER [IGNORE] TABLEtbl_namealter_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_namecolumn_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_namesINTO (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_nameDROP FOREIGN KEYfk_symbol;
単一 ALTER TABLE ステートメントの別々の条項の中に外部キーを追加したりドロップしたりはできません。別々のステートメントを利用しなければいけません。
追加情報については を参照してください。項4. 「FOREIGN KEY 制約」
テーブルが書き込みロックされ、ALTER TABLE がテーブル構造を変更するのに利用されると、保留中の INSERT DELAYED ステートメントは失われてしまいます。
もしテーブルのデフォルト文字セットと全ての文字カラム(CHAR、VARCHAR、TEXT)を新しい文字セットに変更したければ、このようなステートメントを利用してください。
ALTER TABLEtbl_nameCONVERT 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_nameDEFAULT 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」 も参照してください。