ALTER [ONLINE | OFFLINE] [IGNORE] TABLEtbl_name
alter_specification
[,alter_specification
] ...alter_specification
:table_options
| ADD [COLUMN]col_name
column_definition
[FIRST | AFTERcol_name
] | ADD [COLUMN] (col_name
column_definition
,...) | ADD {INDEX|KEY} [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] PRIMARY KEY [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] UNIQUE [INDEX|KEY] [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD FULLTEXT [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | ADD SPATIAL [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | 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
new_col_name
column_definition
[FIRST|AFTERcol_name
] | MODIFY [COLUMN]col_name
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 SET [=]charset_name
[COLLATE [=]collation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE |partition_options
| ADD PARTITION (partition_definition
) | DROP PARTITIONpartition_names
| COALESCE PARTITIONnumber
| REORGANIZE PARTITION [partition_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 | RTREE}index_option
: KEY_BLOCK_SIZE [=]value
|index_type
| WITH PARSERparser_name
| COMMENT 'string
'table_options
:table_option
[[,]table_option
] ...
ALTER TABLE
で既存テーブルの構造を変更することができます。たとえば、カラムの追加や削除、インデックスの作成や破壊、既存カラム型の変更、またはカラムやテーブル自体の名前の変更をすることができます。テーブルや、テーブル型のコメントを変更することもできます。
多くの許容される変更の構文は、CREATE
TABLE
ステートメントの節に似ています。詳細については、項8.1.17. 「CREATE TABLE
構文」
を参照してください。
ストレージエンジンがその操作をサポートしていないテーブルに対しては、いくつかの操作の結果は警告になってしまうかもしれません。これらの警告は
SHOW WARNINGS
で表示することができます。項8.5.5.42. 「SHOW WARNINGS
構文」
を参照してください。
ほとんどの場合、ALTER
TABLE
は元テーブルの一時コピーを作成することで起動します。そのコピー上で変更が行われ、その後元テーブルが削除されて新しいテーブルがリネームされます。ALTER
TABLE
が実行されている間、元のテーブルをほかのセッションから読み取ることができます。新しいテーブルの準備ができるまで更新と書き込みは止められ、その後更新に失敗することなく新しいテーブルに自動的にリダイレクトされます。一時テーブルは、新しいテーブルのデータベースディレクトリに作成されます。ALTER
TABLE
がテーブルの名前を別のデータベースに変更している場合、このデータベースディレクトリは元のテーブルと異なっていてもかまいません。
一時テーブルが必要ない場合がいくつかあります。
テーブルデータを変更せず、テーブルメタデータのみを変更する変更は、テーブルコンテンツを変更せず、テーブルの
.frm
ファイルを変更することによってただちに実行できます。次の変更は、この方法で迅速に実行できます。
カラムまたはインデックスの名前の変更。
カラムのデフォルト値の変更。
有効なメンバー値のリストの最後に新しい列挙またはセットメンバーを追加することによる、ENUM
または
SET
カラムの定義の変更。
場合によっては、VARCHAR(10)
カラムの VARCHAR(15)
への変更などの操作が即座に実行されることもありますが、これはテーブルのストレージエンジンによって異なります。VARCHAR(10)
を 255 を超える長さにするといった変更は、1
バイトを使用して長さを格納していたものを
2
バイトを使用するようにデータ値を変更する必要があるため、即座には実行されません。
ALTER TABLE
をほかのオプションを指定せずに使用すると、MySQL
は単純に、テーブル
tbl_name
RENAME TO
new_tbl_name
tbl_name
に対応するすべてのファイルの名前を変更します。(テーブルをリネームするために
RENAME TABLE
ステートメントを利用することもできます。項8.1.33. 「RENAME TABLE
構文」
を参照してください。)
リネームされたテーブルに与えられた権限は、新しい名前に移動しません。それらは手動で変更しなければいけません。
ALTER TABLE ...ADD
PARTITION
は MySQL
クラスタ以外に一時テーブルを作成しません。RANGE
や LIST
パーティションの
ADD
や
DROP
操作は直接の操作、またはそれに近い操作です。HASH
または KEY
パーティションに対する
ADD
または
COALESCE
操作によって、変更されたパーティション間でデータがコピーされます。LINEAR
HASH
または LINEAR
KEY
が使用されていないかぎり、これは新しいテーブルの作成とほぼ同じです
(ただし、操作はパーティションごとに実行される)。REORGANIZE
操作は変更されたパーティションだけをコピーし、変更されていないものには関係しません。
そうでない場合、データのコピーが厳密には必要でなくても、MySQL
は一時テーブルを作成します。MyISAM
テーブルは、高い値に
myisam_sort_buffer_size
システム変数を設定することで、インデックスの再作成操作のスピードを上げることができます。(これは変更プロセスの中で一番遅い操作です)。
old-alter-table
を
ON
に設定することによって、強制的に
ALTER TABLE
操作で (MySQL
5.0 でサポートされている)
一時テーブルの方法が使用されるようにすることができます。
ALTER TABLE
のトラブルシューティングについては、Problems with ALTER TABLE
を参照してください。
ALTER TABLE
を利用するには、テーブルに
ALTER
、INSERT
、そして
CREATE
権限が必要です。
MySQL 5.1.7 からは、ADD
INDEX
および
DROP INDEX
操作は、インデックスが可変幅カラム上にある場合のみオンラインで実行されます。
MySQL Cluster NDB 6.2.5 および MySQL Cluster NDB 6.3.3
からは、ONLINE
キーワードを使用して、NDBCLUSTER
テーブルに対する ADD
COLUMN
、ADD
INDEX
(CREATE
INDEX
ステートメントを含む)、および
DROP INDEX
操作をオンラインで実行できます。また、NDBCLUSTER
テーブルのオンラインでの名前の変更もサポートされます。
現在、ディスクベースのカラムは
NDBCLUSTER
テーブルにオンラインで追加できません。つまり、テーブルレベルの
STORAGE DISK
オプションを使用する
NDBCLUSTER
テーブルにインメモリーカラムを追加する場合は、メモリーベースのストレージを使用するとして新しいカラムを明示的に宣言する必要があります。たとえば、テーブル領域
ts1
をすでに作成していて、テーブル
t1
を次のように作成するとします。
mysql>CREATE TABLE t1 (
>c1 INT NOT NULL PRIMARY KEY,
>c2 VARCHAR(30)
>)
>TABLESPACE ts1 STORAGE DISK
>ENGINE NDBCLUSTER;
Query OK, 0 rows affected (1.73 sec) Records: 0 Duplicates: 0 Warnings: 0
次に示すように、新しいインメモリーカラムをこのテーブルにオンラインで追加できます。
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY;
Query OK, 0 rows affected (1.25 sec)
Records: 0 Duplicates: 0 Warnings: 0
STORAGE MEMORY
オプションが省略されている場合、このステートメントは失敗します。
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC;
ERROR 1235 (42000): This version of MySQL doesn't yet support
'ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC'
COLUMN_FORMAT DYNAMIC
オプションを省略した場合は、動的なカラム形式が自動的に使用されますが、次に示すような警告が発行されます。
mysql>ALTER ONLINE TABLE t1 ADD COLUMN c3 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1478 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>SHOW CREATE TABLE t1\G
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) NOT NULL, `c2` varchar(30) DEFAULT NULL, `c3` int(11) /*!50120 STORAGE MEMORY */ /*!50120 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL, `t4` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL, PRIMARY KEY (`c1`) ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.03 sec)
MySQL Cluster NDB 6.2.17、6.3.23、および 6.4.3
より前のバージョンでは、テーブルレベルまたはカラムレベルの
STORAGE DISK
オプションを使用して作成されたテーブルへのインメモリーカラムの追加が正しく機能しませんでした。(Bug#42549)
また、MyISAM
のテーブルやカラムの名前をオンラインで変更することもできます。ただし、MyISAM
テーブルのカラムまたはインデックスを追加または削除する操作で
ONLINE
を使用することはできません。
オンライン操作はコピーなしです。つまり、インデックスを再作成する必要はありません。また、変更されているテーブルから
MySQL Cluster 内のほかの API
ノードへのアクセスもロックされません
(ただし、この節のあとの方にある「制限」を参照)。
このような操作では、複数の API
ノードを含むクラスタ内で実行される
NDBCLUSTER
テーブルの変更に対して単一ユーザーモードは必要ありません。オンラインの
DDL
操作中、トランザクションは中断されずに続行できます。
また、MySQL Cluster NDB 7.0
では、NDBCLUSTER
テーブルに対してステートメント
ALTER ONLINE TABLE ... REORGANIZE
PARTITION
を
オプションなしで使用することもできます。これを使用すると、オンラインでクラスタに追加された新しいデータノードの間で
MySQL Cluster
データを再配布できます。このステートメントの詳細については、この節のあとの方で説明します。
MySQL Cluster
へのオンラインでのデータノードの追加の詳細については、Adding MySQL Cluster Data Nodes Online
を参照してください。
partition_names
INTO
(partition_definitions
)
MySQL Cluster NDB 6.4.3
より前のバージョンでは、
オプションを指定しない
partition_names
INTO
(partition_definitions
)ALTER ONLINE TABLE ... REORGANIZE
PARTITION
は、ディスクデータテーブル、または 1
つ以上のディスクベースのカラムを含むインメモリーの
NDBCLUSTER
テーブルでは正しく機能しませんでした。(Bug#42549)
ONLINE
および
OFFLINE
キーワードは、MySQL Cluster NDB 6.2、6.3、7.0
(バージョン 6.2.5、6.3.3、および 6.4.0
から)、および以降の MySQL Cluster
リリースシリーズでのみサポートされています。MySQL
のほかのバージョンの場合 (5.1.17 以降):
ADD INDEX
または
DROP
INDEX
操作をオンラインまたはオフラインで実行できる
(また、これらの操作がオンラインまたはオフラインで実行される)
かどうかは、サーバーによって自動的に決定されます。カラムのデータ型が可変幅の場合、これらの操作はオンラインで実行されます。これに関するサーバーの動作をオーバーライドすることはできません。
ALTER
TABLE
ステートメントで
ONLINE
または
OFFLINE
キーワードを使用しようとすると、エラーが発生します。
制限.
カラムを追加するオンラインの
ALTER TABLE
操作は、次の制限に従います。
変更されているテーブルは、オンラインの
ALTER
TABLE
、ADD
COLUMN
、CREATE
INDEX
、または
DROP INDEX
ステートメントが実行されている以外の
API
ノードに関してはロックされません。ただし、オンライン操作が実行されている間、このテーブルは同じ
API
ノードから発信されているほかのすべての操作に対してロックされます。
変更されるテーブルには、明示的な主キーが存在する必要があります。NDBCLUSTER
ストレージエンジンによって作成された隠し主キーは、この目的には不十分です。オンラインで追加されるカラムは、次の条件を満たしている必要があります。
このようなカラムは動的である必要があります。つまり、COLUMN_FORMAT
DYNAMIC
を使用して作成できる必要があります。
このようなカラムは NULL
にできる必要があり、かつ
NULL
以外の明示的なデフォルト値を持っていてはいけません。オンラインで追加されるカラムは、次に示すように、DEFAULT
NULL
として自動的に作成されます。
mysql>CREATE TABLE t1 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
>) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1
>ADD COLUMN c2 INT,
>ADD COLUMN c3 INT;
Query OK, 0 rows affected, 2 warnings (0.93 sec) mysql>SHOW CREATE TABLE t2\G
*************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
カラムは、既存のカラムのあとに追加する必要があります。既存のカラムが存在する前にオンラインでカラムを追加しようとすると、ステートメントがエラーで失敗します。また、FIRST
キーワードを使用してオンラインでカラムを追加しようとした場合も失敗します。
さらに、既存のテーブルカラムをオンラインで並べ替えることはできません。
テーブルで使用されるストレージエンジンをオンラインで変更することはできません。
前の制限は、テーブルまたはカラムの名前を変更するだけの操作には適用されません。
ストレージエンジンがオンラインの
ALTER
TABLE
をサポートしている場合は、次に示すように、オンラインでカラムが追加されるとき、またはオンラインでインデックスが作成または削除されるときに、固定形式のカラムが動的形式に変換されます。
mysql>CREATE TABLE t1 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
>) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (1.44 sec) mysql>ALTER ONLINE TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT;
Query OK, 0 rows affected, 2 warnings (0.93 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 2 rows in set (0.00 sec)
既存のカラム (テーブルの主キーを含む) は、動的である必要はありません。動的である必要があるのは、オンラインで追加されるカラムだけです。
mysql>CREATE TABLE t2 (
>c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
>) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (2.10 sec) mysql>ALTER ONLINE TABLE t2 ADD COLUMN c2 INT;
Query OK, 0 rows affected, 1 warning (0.78 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec)
名前の変更操作によって、カラムが
FIXED
から
DYNAMIC
のカラム形式に変換されることはありません。COLUMN_FORMAT
の詳細については、項8.1.17. 「CREATE TABLE
構文」
を参照してください。
オンラインの DROP
COLUMN
操作はサポートされていません。
特定のオンライン
ALTER
TABLE
では、ADD
COLUMN
、ADD
INDEX
、DROP
INDEX
のいずれか 1
つのみを使用できます。1
つのステートメントで、1
つ以上のカラムをオンラインで追加できます。1
つのステートメントで、1
つのインデックスのみをオンラインで作成または削除できます。
KEY
、CONSTRAINT
、および
IGNORE
キーワードは、ONLINE
キーワードを使用する
ALTER TABLE
ステートメントでサポートされます。
また、MyISAM
テーブルのカラムの名前を変更する
ALTER TABLE ... CHANGE
...
ステートメントでは、ONLINE
および OFFLINE
キーワードもサポートされます。
IGNORE
はスタンダード SQL の MySQL
拡張子です。これは、新しいテーブルのユニークキーに複製があったり、厳密モードが有効時に警告が出たりしたときに
ALTER TABLE
がどのように機能するかコントロールします。もし
IGNORE
が指定されなければ、重複キーエラーが起きたとき、コピーは異常終了し、元に戻されます。もし
IGNORE
が指定されると、ユニークキーに複製された行の、最初の行だけが使用され、それ以外の相反する行は削除されます。不正な値は、適合する許容値に一番近い値まで切り捨てられます。
table_option
は、ENGINE
、AUTO_INCREMENT
、AVG_ROW_LENGTH
などの、CREATE
TABLE
ステートメントで使用できる種類のテーブルオプションを示します。(項8.1.17. 「CREATE TABLE
構文」
は、すべてのテーブルオプションを示しています。)
しかし、ALTER
TABLE
は DATA
DIRECTORY
と INDEX
DIRECTORY
テーブルオプションを無視します。
たとえば、テーブルが
InnoDB
テーブルになるように変換するには、このステートメントを利用します。
ALTER TABLE t1 ENGINE = InnoDB;
テーブルのストレージエンジンを変更しようとすると、Server SQL Modes
で説明されているように、その結果は目的のストレージエンジンが使用可能かどうかと、NO_ENGINE_SUBSTITUTION
SQL モードの設定によって影響されます。
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
DROPINDEX
はスタンダード SQL の MySQL 拡張子です。
MODIFY
は
ALTER TABLE
のオラクル拡張子です。
COLUMN
という言葉は任意であり、省くことができます。
column_definition
節は
CREATE TABLE
と同じように、ADD
と CHANGE
に同じ構文を利用します。項8.1.17. 「CREATE TABLE
構文」
を参照してください。
CHANGE
節を使用して、カラムの名前を変更できます。それを行うには、カラムの古い名前と新しい名前、および現在そのカラムに設定されている定義を指定します。たとえば、old_col_name
new_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
を使用する場合は、column_definition
に、データ型および PRIMARY
KEY
や UNIQUE
などのインデックス属性以外の、新しいカラムに適用するすべての属性が含まれている必要があります。元の定義に存在するが、新しい定義で指定されていない属性は引き継がれません。カラム
col1
が
INT UNSIGNED DEFAULT 1 COMMENT 'my
column'
と定義されているときに、カラムを次のように変更するとします。
ALTER TABLE t1 MODIFY col1 BIGINT;
結果として得られるカラムは
BIGINT
と定義されますが、属性
UNSIGNED DEFAULT 1 COMMENT 'my
column'
は含まれません。それを保持するには、ステートメントを次のようにしてください。
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
CHANGE
や
MODIFY
を利用してデータ型を変更するとき、MySQL
は既存カラムを新しい型に可能なかぎり変換しようと試みます。
この変換によって、データが変更される可能性があります。たとえば、文字列カラムを短くすると、値が切り詰められる可能性があります。新しいデータ型への変換によってデータの損失が発生する場合に、その操作が成功しないようにするには、ALTER
TABLE
を使用する前に厳密な SQL
モードを有効にします
(Server SQL Modes を参照)。
テーブル行内の特定の位置にカラムを追加するには、FIRST
または AFTER
を使用します。デフォルトはカラムを最後に追加します。また、col_name
CHANGE
または MODIFY
操作で FIRST
と
AFTER
を使用して、テーブル内のカラムを並べ替えることもできます。
ALTER ... SET DEFAULT
または ALTER ... DROP
DEFAULT
は、それぞれ、カラムの新しいデフォルト値を指定するか、または古いデフォルト値を削除します。もし古いデフォルトが削除されて、カラムが
NULL
になり得るなら、新しいデフォルトは
NULL
です。カラムを
NULL
にできない場合は、項6.1.4. 「データ型デフォルト値」
で説明されているように、MySQL
によってデフォルト値が割り当てられます。
DROP INDEX
はインデックスを削除します。これはスタンダード
SQL の MySQL
拡張子です。詳しくは項8.1.24. 「DROP INDEX
構文」を参照してください。インデックス名に確信がない場合は、SHOW
INDEX FROM
を使用します。
tbl_name
もしカラムがテーブルからドロップされると、そのカラムが関わっているすべてのインデックスからも削除されます。もし
1
つのインデックスを構成しているすべてのカラムがドロップされると、そのインデックスもドロップされます。インデックスを持つカラムを短くするために
CHANGE
や
MODIFY
を利用し、その結果カラム長がインデックス長よりも短くなるなら、MySQL
はインデックスを自動的に短くします。
もしテーブルがカラムを 1
つだけ含んでいると、そのカラムはドロップできません。もしテーブルを削除したいのであれば、代わりに
DROP TABLE
を利用してください。
DROP PRIMARY KEY
は主キーを削除します。主キーが存在しない場合は、エラーが発生します。
テーブルに UNIQUE
INDEX
または PRIMARY
KEY
を追加すると、MySQL
が重複キーをできるだけ早く検出できるように、一意でないインデックスの前に格納されます。
いくつかのストレージエンジンでは、インデックスを作成するときに型を指定することができます。index_type
指定子の構文は USING
です。type_name
USING
の詳細については、項8.1.13. 「CREATE INDEX
構文」
を参照してください。MySQL 5.1.10
以前では、USING
はインデックスカラムリストの前だけに与えることができました。5.1.10
以降のバージョンでの望ましい位置は、カラムリストの後ろです。このオプションをカラムリストの前で使用すると、将来の
MySQL リリースでは認識されなくなります。
index_option
値はインデックスの追加オプションを指定します。USING
はそのようなオプションの 1 つです。許容
index_option
値の詳細に関しては 項8.1.13. 「CREATE INDEX
構文」
を参照してください。
ALTER TABLE
ステートメントのあとに、インデックスカーディナリティー情報を更新するために
ANALYZE TABLE
の実行が必要になることがあります。項8.5.5.23. 「SHOW INDEX
構文」
を参照してください。
ORDER BY
を使用すると、特定の順序で行が含まれる新しいテーブルを作成できます。挿入と削除のあとではテーブルの順番が変わってしまうことを覚えておいてください。このオプションは、ほとんど毎回同じ順番で行のクエリーを行う場合に便利です。テーブルに大きい変更を行ったあとにこのオプションを利用すると、高い性能を得ることが可能でしょう。テーブルが、あとでカラムをオーダーしたい順番になっていれば、MySQL
のソートは簡単になる場合があります。
ORDER BY
構文は、ソートの昇順や降順を指示するために、それぞれが任意で
ASC
または
DESC
が付随する 1
つか 2
つのカラム名を指定できます。デフォルトは昇順です。カラム名だけがソート基準として許されていて、任意の式は許されていません。
ORDER BY
は、ユーザー定義のクラスタ化されたインデックス
(PRIMARY KEY
または
NOT NULL UNIQUE
インデックス) を含む
InnoDB
テーブルでは意味がありません。このようなインデックスが存在する場合、InnoDB
は、常にそのインデックスに従ってテーブル行を並べ替えます。
パーティション化されたテーブルに対して使用されている場合、ALTER
TABLE ... ORDER BY
は、各パーティション内でのみ行を並べ替えます。
MyISAM
テーブルに対して
ALTER TABLE
を使用した場合、一意でないインデックスはすべて
(REPAIR TABLE
として)
別のバッチに作成されます。多くのインデックスがあるときは、この方法で
ALTER TABLE
が大変早くなります。
この機能は、MyISAM
テーブルに対して明示的に有効にすることができます。ALTER
TABLE ... DISABLE KEYS
は、一意でないインデックスの更新を停止するよう
MySQL
に通知します。次に、ALTER
TABLE ... ENABLE KEYS
を使用して、欠けているインデックスを再作成するようにしてください。MySQL
は、キーを 1 つ 1
つ挿入するよりも大変早い特別なアルゴリズムを利用してこの作業を行いますので、大量挿入を行う前にキーを無効化しておくことでかなりのスピードアップを実現することができます。ALTER
TABLE ... DISABLE KEYS
を使用するには、先に説明した権限に加えて
INDEX
権限が必要です。
一意でないインデックスは、無効になっている間、有効なときにはこのインデックスを使用する
SELECT
や
EXPLAIN
などのステートメントで無視されます。
ENABLE KEYS
と
DISABLE KEYS
は、MySQL
5.1.11
より前のバージョンではパーティション化されたテーブルに対してサポートされていませんでした。
InnoDB
テーブルに対する
ALTER TABLE
によって
(たとえば、カラムが切り詰められたために)
カラム値が変更された場合、InnoDB
の FOREIGN KEY
制約チェックでは、値の変更によって発生する可能性のある違反を認識できません。
FOREIGN KEY
および
REFERENCES
節は、ADD [CONSTRAINT
[
を実装する
symbol
]] FOREIGN KEY (...)
REFERENCES ... (...)InnoDB
ストレージエンジンでサポートされます。詳しくは項9.4.4. 「FOREIGN KEY
制約」を参照してください。その他のストレージエンジンでは、節は解析されますが、無視されます。CHECK
節は、すべてのストレージエンジンに解析されますが、無視されます。詳しくは項8.1.17. 「CREATE TABLE
構文」を参照してください。構文を受け入れながらも無視するのは、別の
SQL
サーバーからコードをポートし易くし、参照を利用してテーブルを作成するアプリケーションを起動させるという、互換性のためです。MySQL Differences from Standard SQL
を参照してください。
参照がカラム仕様の一部として定義されているインラインの
REFERENCES
仕様は、InnoDB
によって暗黙のうちに無視されます。InnoDB
は、個別の FOREIGN
KEY
仕様の一部として定義されている
REFERENCES
節のみを受け入れます。
パーティション化されたテーブルは外部キーをサポートしません。詳細については、Restrictions and Limitations on Partitioning を参照してください。
InnoDB
は、外部キーを削除するための
ALTER TABLE
の使用をサポートします。
ALTER TABLEtbl_name
DROP FOREIGN KEYfk_symbol
;
詳細は 項9.4.4. 「FOREIGN KEY
制約」
をご覧ください。
単一 ALTER
TABLE
ステートメントの別々の節の中に外部キーを追加したりドロップしたりはできません。別々のステートメントを利用しなければいけません。
.ibd
ファイル内の独自のテーブル領域を使用して作成された
InnoDB
テーブルでは、そのファイルを破棄したり、インポートしたりすることができます。.ibd
ファイルを廃棄するためには、このステートメントを利用してください。
ALTER TABLE tbl_name
DISCARD TABLESPACE;
これは現在の .ibd
ファイルを削除しますので、まずバックアップがあることを確認してください。テーブル領域ファイルが廃棄されている最中にテーブルにアクセスしようとすると、エラーが発生します。
.ibd
のバックアップファイルをインポートするためには、まずそれをデータベースディレクトリにコピーし、そしてこのステートメントを発行してください。
ALTER TABLE tbl_name
IMPORT TABLESPACE;
項9.2.1. 「Per-Table テーブル領域を利用する」 を参照してください。
テーブルが書き込みロックされ、ALTER
TABLE
がテーブル構造を変更するのに利用されると、保留中の
INSERT
DELAYED
ステートメントは失われてしまいます。
テーブルのデフォルトキャラクタセットとすべての文字カラム
(CHAR
、VARCHAR
、TEXT
)
を新しいキャラクタセットに変更する場合は、次のようなステートメントを使用します。
ALTER TABLEtbl_name
CONVERT TO CHARACTER SETcharset_name
;
VARCHAR
のデータ型、またはいずれかの
TEXT
型のカラムの場合、CONVERT
TO CHARACTER SET
では、新しいカラムが元のカラムと同じ文字数を格納できるだけの十分な長さになるようにするために、必要に応じてデータ型を変更します。たとえば、TEXT
カラムは 2
バイトの長さを持っており、カラムには最大
65,535
バイトまでの長さの値が格納されます。latin1
TEXT
カラムの場合は、各文字に 1
バイトが必要なため、カラムには最大 65,535
文字を格納できます。このカラムが
utf8
に変換された場合は、各文字に最大 3
文字が必要になる可能性があるため、最大で
3 × 65,535 = 196,605
バイトの長さになることがあります。この長さは
TEXT
カラムのバイト長には収まらないため、MySQL
はデータ型を、バイト長に 196,605
の値を記録できる最小の文字列型である
MEDIUMTEXT
に変換します。同様に、VARCHAR
カラムも
MEDIUMTEXT
に変換される可能性があります。
今説明した型のデータ型の変更を回避するには、CONVERT
TO CHARACTER SET
を使用しないでください。代わりに、MODIFY
を使用して個々のカラムを変更します。例 :
ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M
) CHARACTER SET utf8;
CONVERT TO CHARACTER SET
binary
を指定すると、CHAR
、VARCHAR
、および
TEXT
カラムはそれぞれ対応するバイナリ列型、BINARY
、VARBINARY
、BLOB
に変換されます。つまり、カラムにキャラクタセットが割り当てられなくなるため、これらのカラムには以降の
CONVERT TO
操作が適用されません。
charset_name
が
DEFAULT
の場合は、データベースのキャラクタセットが使用されます。
CONVERT TO
操作は、キャラクタセットの間でカラム値を変換します。もし
1
つのキャラクタセット内にカラムを持つが
(latin1
等)、格納値は実際には別の互換性のないキャラクタセット
(utf8
等)
を利用しているという場合には、これは
必要ではありません。このような場合は、それぞれのカラムに対して次のような作業が必要になります。
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
BLOB
カラムへの、またはそれからの変換時には変換が起きないため、これが有効なのです。
テーブルの default キャラクタセットだけを変更するには、このステートメントを利用してください。
ALTER TABLEtbl_name
DEFAULT CHARACTER SETcharset_name
;
DEFAULT
という言葉は任意です。あとで
(たとえば、ALTER TABLE ... ADD
column
を使用して)
テーブルに追加するカラムのキャラクタセットを指定しない場合、使用されるキャラクタセットはデフォルトキャラクタセットになります。
MySQL 5.1.5
では、パーティション分割関連のいくつかの拡張機能が
ALTER TABLE
に追加されました。これらをパーティション化されたテーブルで使用すると、再パーティション化したり、パーティションを追加、削除、マージ、および分割したり、パーティション分割の保守を実行したりすることができます。
そのまま partition_options
節をパーティション化されたテーブル上で
ALTER TABLE
と共に利用すると、partition_options
によって定義された分割スキーマに従って、そのテーブルを再分割します。この節は必ず
PARTITION BY
で始まり、CREATE
TABLE
の
partition_options
節に適応するのと同様で、同じ構文と別の規則が後に続きます。(さらに詳細な説明については
項8.1.17. 「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
を利用して作成されたものと同じ規則に従わなければいけません。これには、Partitioning Keys, Primary Keys, and Unique Keys
で説明されているように、テーブルに含まれている可能性のある任意のユニークキー
(任意の主キーを含む)
の関係を管理する規則と、パーティション分割式で使用されているカラムが含まれます。パーティションの数を指定するための
CREATE TABLE ... PARTITION
BY
規則は、ALTER
TABLE ... PARTITION BY
にも適用されます。
ALTER TABLE ... PARTITION
BY
は MySQL 5.1.6
から利用可能になりました。
ALTER TABLE ADD PARTITION
に対する partition_definition
節は、CREATE
TABLE
ステートメントに対する同じ名前の節と同じオプションをサポートします。(構文と説明に関しては
項8.1.17. 「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
は、NDBCLUSTER
ストレージエンジンを使用するテーブルでは機能しません。Management of RANGE
and LIST
Partitions、Known Limitations of 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
を利用して定義されたパーティションのサブセットの値リストを変更する。
また、データを強制的に再配布するために、HASH
分割を使用して自動的にパーティション化されたテーブルに対して、このステートメントを
オプションなしで使用することもできます。(現在、この方法で自動的にパーティション化されるのは
partition_names
INTO
(partition_definitions
)NDBCLUSTER
テーブルだけです。) これは、既存の MySQL
Cluster に新しい MySQL Cluster
データノードをオンラインで追加したあと、既存の
MySQL Cluster
テーブルデータを新しいデータノードに再配布できる
MySQL Cluster NDB 6.4.0
以降で有効です。その場合は、次に示すとおりに
ONLINE
オプションを指定してステートメントを呼び出すようにしてください。
ALTER ONLINE TABLE table
REORGANIZE PARTITION;
ほかの DDL
をオンラインのテーブル再編成と同時に実行することはできません。つまり、ALTER
ONLINE TABLE ... REORGANIZE PARTITION
ステートメントが実行されている間は、ほかの
DDL
ステートメントを発行できません。オンラインでの
MySQL Cluster
データノードの追加の詳細については、Adding MySQL Cluster Data Nodes Online
を参照してください。
明示的にパーティション化されたテーブルに対して、REORGANIZE
PARTITION
を
オプションなしで使用しようとすると、エラーが発生します。
パラメータなしの REORGANIZE PARTITION
は、HASH
分割を使用して自動的にパーティション化されたテーブルに対してのみ使用できます。.
partition_names
INTO
(partition_definitions
)
明示的に名前が付けられていないパーティションに対して、MySQL
は自動的に
p0
、p1
、p2
などのデフォルト名を付けます。 MySQL 5.1.7
では、サブパーティションに関しても同じことが言えます。
ALTER TABLE ... REORGANIZE
PARTITION
ステートメントに関する詳細情報と例に関しては、Partition Management
を参照してください。
特定の ALTER
TABLE
ステートメントで使用できるのは、1 つの
PARTITION
BY
、ADD
PARTITION
、DROP
PARTITION
、REORGANIZE
PARTITION
、または
COALESCE PARTITION
節だけです。
MySQL 5.1.5
では、CHECK
TABLE
や
REPAIR TABLE
などのステートメントによる、パーティション化されていないテーブルのために実装されている機能に似たパーティションの保守および修復機能を提供するためのいくつかの追加オプションが導入されました
(MySQL 5.1.27
からは、これらの機能はパーティション化されたテーブルに対してもサポートされています。この項目の最後にある注記を参照)。これらには、ANALYZE
PARTITION
、CHECK
PARTITION
、OPTIMIZE
PARTITION
、REBUILD
PARTITION
、そして
REPAIR PARTITION
が含まれます。これらのオプションのそれぞれは、カンマで区切られた
1 つか複数のパーティション名で構成される
partition_names
節を利用します。パーティションは変更されるテーブルの中にすでに存在していなければいけません。詳細および例については、Maintenance of Partitions
を参照してください。
ANALYZE
PARTITION
、CHECK
PARTITION
、OPTIMIZE
PARTITION
、および
REPAIR PARTITION
オプションは MySQL 5.1.24 で無効になり、MySQL
5.1.27 でふたたび有効になりました。(Bug#20129)
これらのオプションは、パーティション化されていないテーブルに対してはサポートされておらず、MySQL
5.1.31
からはこのようなテーブルに対して禁止されています。
MySQL 5.1.27
からは、パーティション化されたテーブルに対してステートメント
ANALYZE
TABLE
、CHECK
TABLE
、OPTIMIZE
TABLE
、および
REPAIR
TABLE
を使用できます。詳細については、項8.5.2. 「テーブル保守ステートメント」
を参照してください。
テーブルや、そのデータに影響を与える事無くテーブルの分割を除去できるようにするため、MySQL
5.1.8 で REMOVE
PARTITIONING
が導入されました。(以前は、これは
ENGINE
オプションを使用して実行されました。)
このオプションは、追加、ドロップ、ドロップカラムやインデックスをリネームするために利用されるような、ALTER
TABLE
オプションと組み合わせることができます。
MySQL 5.1.7
以前のバージョンでは、ENGINE
オプションを
ALTER TABLE
と一緒に利用すると、テーブルが削除されてしまう可能性がある分割の原因になりました。MySQL5.1.8
からは、このオプションによる、テーブルに利用されるストレージエンジンの変更はほとんど無く、分割にもまったく影響を与えません。
mysql_info()
C
API
機能を利用すると、いくつの行がコピーされ、(IGNORE
が利用されたとき)
いくつの行がユニークキー値の複製のために削除されたのかを確認することができます。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
に
UNIQUE
インデックスを追加するには、次のようにします。
ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (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
として宣言します。
NDB
テーブルの場合は、テーブルまたはカラムに使用されるストレージ型を変更することもできます。たとえば、次に示すように作成された
NDB
テーブルを考えてみます。
mysql> CREATE TABLE t1 (c1 INT) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.27 sec)
このテーブルをディスクベースのストレージに変換するには、次の
ALTER TABLE
ステートメントを使用できます。
mysql>ALTER TABLE t1 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (2.99 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW CREATE TABLE t1\G
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `c1` int(11) DEFAULT NULL ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.01 sec)
テーブルが最初に作成されたときにテーブル領域が参照されている必要はありませんが、テーブル領域は
ALTER TABLE
によって参照される必要があります。
mysql>CREATE TABLE t2 (c1 INT) ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.00 sec) mysql>ALTER TABLE t2 STORAGE DISK;
ERROR 1005 (HY000): Can't create table 'c.#sql-1750_3' (errno: 140) mysql>ALTER TABLE t2 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (3.42 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql>SHOW CREATE TABLE t2\G
*************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t2` ( `c1` int(11) DEFAULT NULL ) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.01 sec)
個々のカラムのストレージ型を変更するには、ALTER
TABLE ... MODIFY [COLUMN]
を使用できます。たとえば、次の
CREATE TABLE
ステートメントを使用して、2
つのカラムを含む MySQL Cluster
ディスクデータテーブルを作成するとします。
mysql>CREATE TABLE t3 (c1 INT, c2 INT)
->TABLESPACE ts_1 STORAGE DISK ENGINE NDB;
Query OK, 0 rows affected (1.34 sec)
カラム c2
をディスクベースのストレージからインメモリーストレージに変更するには、次に示すように、ALTER
TABLE ステートメントで使用されるカラム定義に
STORAGE MEMORY 節を含めます。
mysql> ALTER TABLE t3 MODIFY c2 INT STORAGE MEMORY;
Query OK, 0 rows affected (3.14 sec)
Records: 0 Duplicates: 0 Warnings: 0
同様の方法で STORAGE
DISK
を使用して、インメモリーカラムをディスクベースのカラムにすることができます。
カラム c1
は
(CREATE TABLE
ステートメント内のテーブルレベルの
STORAGE DISK
節によって決定される)
テーブルのデフォルトである、ディスクベースのストレージを使用します。ただし、SHOW
CREATE TABLE
の次の出力に見られるように、カラム
c2
はインメモリーストレージを使用します。
mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`c1` int(11) DEFAULT NULL,
`c2` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.02 sec)
AUTO_INCREMENT
カラムを追加すると、カラム値には、自動的にシーケンス番号が入力されます。MyISAM
テーブルの場合は、ALTER
TABLE
の前に SET
INSERT_ID=
を実行するか、または
value
AUTO_INCREMENT=
テーブルオプションを使用することによって、最初のシーケンス番号を設定できます。Session System Variables
を参照してください。
value
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;