ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]
alter_option: {
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX | KEY} [index_name]
[index_type] (key_part,...) [index_option] ...
| ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
(key_part,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
| DROP {CHECK | CONSTRAINT} symbol
| ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
| ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
| ALTER [COLUMN] col_name {
SET DEFAULT {literal | (expr)}
| SET {VISIBLE | INVISIBLE}
| DROP DEFAULT
}
| ALTER INDEX index_name {VISIBLE | INVISIBLE}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST | AFTER col_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| {DISABLE | ENABLE} KEYS
| {DISCARD | IMPORT} TABLESPACE
| DROP [COLUMN] col_name
| DROP {INDEX | KEY} index_name
| DROP PRIMARY KEY
| DROP FOREIGN KEY fk_symbol
| FORCE
| LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ORDER BY col_name [, col_name] ...
| RENAME COLUMN old_col_name TO new_col_name
| RENAME {INDEX | KEY} old_index_name TO new_index_name
| RENAME [TO | AS] new_tbl_name
| {WITHOUT | WITH} VALIDATION
}
partition_options:
partition_option [partition_option] ...
partition_option: {
ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| DISCARD PARTITION {partition_names | ALL} TABLESPACE
| IMPORT PARTITION {partition_names | ALL} TABLESPACE
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
| ANALYZE PARTITION {partition_names | ALL}
| CHECK PARTITION {partition_names | ALL}
| OPTIMIZE PARTITION {partition_names | ALL}
| REBUILD PARTITION {partition_names | ALL}
| REPAIR PARTITION {partition_names | ALL}
| REMOVE PARTITIONING
}
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
}
table_options:
table_option [[,] table_option] ...
table_option: {
AUTOEXTEND_SIZE [=] value
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
| CONNECTION [=] 'connect_string'
| {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| ENCRYPTION [=] {'Y' | 'N'}
| ENGINE [=] engine_name
| ENGINE_ATTRIBUTE [=] 'string'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
| SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
| STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
| STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
| STATS_SAMPLE_PAGES [=] value
| TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
| UNION [=] (tbl_name[,tbl_name]...)
}
partition_options:
(see CREATE TABLE options)
ALTER TABLE
は、テーブルの構造を変更します。 たとえば、カラムを追加または削除したり、インデックスを作成または破棄したり、既存のカラムの型を変更したり、カラムまたはテーブル自体の名前を変更したりできます。 また、テーブルに使用されているストレージエンジンやテーブルのコメントなどの特性を変更することもできます。
ALTER TABLE
を使用するには、このテーブルに対するALTER
、CREATE
、およびINSERT
権限が必要です。 テーブルを名前変更するには、古いテーブル側でALTER
およびDROP
と、新しいテーブル側でALTER
、CREATE
、およびINSERT
権限が必要です。テーブル名のあとに、行う変更を指定します。 何も指定されていない場合、
ALTER TABLE
は何もしません。許容される変更の多くの構文は、
CREATE TABLE
ステートメントの句と似ています。column_definition
句では、ADD
およびCHANGE
にCREATE TABLE
と同じ構文を使用します。 詳細は、セクション13.1.20「CREATE TABLE ステートメント」を参照してください。COLUMN
という語はオプションであり、RENAME COLUMN
を除いて省略できます (RENAME
テーブルのネーミング操作とカラムのネーミング操作を区別するため)。-
複数の
ADD
,ALTER
,DROP
句およびCHANGE
句をカンマで区切って単一のALTER TABLE
ステートメントで使用できます。 これは、ALTER TABLE
ステートメントごとに各句が 1 つしか許可されない標準 SQL への MySQL 拡張です。 たとえば、1 つのステートメントで複数のカラムを削除するには、次のようにします。ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
ストレージエンジンが試行された
ALTER TABLE
操作をサポートしていない場合は、警告が表示されることがあります。 このような警告は、SHOW WARNINGS
で表示できます。 セクション13.7.7.42「SHOW WARNINGS ステートメント」を参照してください。ALTER TABLE
のトラブルシューティングについては、セクションB.3.6.1「ALTER TABLE での問題」を参照してください。生成されるカラムの詳細は、セクション13.1.9.2「ALTER TABLE および生成されるカラム」 を参照してください。
使用例については、セクション13.1.9.3「ALTER TABLE の例」 を参照してください。
MySQL 8.0.17 以降の
InnoDB
では、key_part
仕様を使用した JSON カラムへの複数値インデックスの追加を(CAST
の形式でサポートしています。 複数値インデックスの作成と使用方法、および複数値インデックスの制限および制限の詳細は、複数値インデックス を参照してください。json_path
AStype
ARRAY)-
mysql_info()
C API 関数を使用すると、ALTER TABLE
によってコピーされた行数を確認できます。 mysql_info()を参照してください。
このセクションの次のトピックで説明するように、ALTER TABLE
ステートメントにはさらにいくつかの側面があります:
テーブルオプション
table_options
は、ENGINE
, AUTO_INCREMENT
, AVG_ROW_LENGTH
, MAX_ROWS
, ROW_FORMAT
や TABLESPACE
などの CREATE TABLE
ステートメントで使用できる種類のテーブルオプションを示します。
すべてのテーブルオプションの詳細は、セクション13.1.20「CREATE TABLE ステートメント」 を参照してください。 ただし、テーブルオプションとして指定されている場合、ALTER TABLE
は DATA DIRECTORY
および INDEX DIRECTORY
を無視します。 ALTER TABLE
では、パーティション化オプションとしてのみ使用でき、FILE
権限が必要です。
ALTER TABLE
でテーブルオプションを使用すると、単一のテーブル特性を簡単に変更できます。 例:
-
t1
が現在InnoDB
テーブルでない場合、次のステートメントはストレージエンジンをInnoDB
に変更します:ALTER TABLE t1 ENGINE = InnoDB;
テーブルを
InnoDB
ストレージエンジンに切り替えるときの考慮事項については、セクション15.6.1.5「MyISAM から InnoDB へのテーブルの変換」を参照してください。ENGINE
句を指定すると、ALTER TABLE
はテーブルを再構築します。 これは、そのテーブルに指定されたストレージエンジンがすでに存在する場合にも当てはまります。既存の
InnoDB
テーブルに対してALTER TABLE
を実行すると、「null」tbl_name
ENGINE=INNODBALTER TABLE
操作が実行されます。これは、セクション15.11.4「テーブルのデフラグ」で説明されているように、InnoDB
テーブルのデフラグに使用できます。InnoDB
テーブルに対してALTER TABLE
を実行しても、同じ機能が実行されます。tbl_name
FORCEALTER TABLE
およびtbl_name
ENGINE=INNODBALTER TABLE
では、online DDL を使用します。 詳細は、セクション15.12「InnoDB とオンライン DDL」を参照してください。tbl_name
FORCEテーブルのストレージエンジンを変更しようとした結果は、セクション5.1.11「サーバー SQL モード」 で説明されているように、目的のストレージエンジンが使用可能かどうか、および
NO_ENGINE_SUBSTITUTION
SQL モードの設定の影響を受けます。データが誤って失われることのないように、
ALTER TABLE
を使用して、テーブルのストレージエンジンをMERGE
またはBLACKHOLE
に変更することはできません。
-
圧縮された行ストレージ形式を使用するように
InnoDB
テーブルを変更するには:ALTER TABLE t1 ROW_FORMAT = COMPRESSED;
-
ENCRYPTION
句は、InnoDB
テーブルのページレベルのデータ暗号化を有効または無効にします。 暗号化を有効にするには、キーリングプラグインをインストールして構成する必要があります。table_encryption_privilege_check
変数が有効になっている場合、デフォルトのスキーマ暗号化設定とは異なる設定でENCRYPTION
句を使用するには、TABLE_ENCRYPTION_ADMIN
権限が必要です。MySQL 8.0.16 より前では、
ENCRYPTION
句は file-per-table テーブルスペースに存在するテーブルを変更する場合にのみサポートされていました。 MySQL 8.0.16 では、ENCRYPTION
句は一般的なテーブルスペースに存在するテーブルに対してもサポートされています。一般的なテーブルスペースに存在するテーブルの場合、テーブルとテーブルスペースの暗号化は一致する必要があります。
テーブルを別のテーブルスペースに移動したり、ストレージエンジンを変更したりしてテーブルの暗号化を変更したりするには、
ENCRYPTION
句を明示的に指定する必要があります。MySQL 8.0.16 の時点では、暗号化をサポートしていないストレージエンジンがテーブルで使用されている場合、
'N'
または''
以外の値でENCRYPTION
句を指定することはできません。 以前は、条項は受け入れられました。 暗号化をサポートしていないストレージエンジンを使用して、暗号化対応スキーマでENCRYPTION
句なしでテーブルを作成しようとすることも許可されていません。詳細は、セクション15.13「InnoDB 保存データ暗号化」を参照してください。
-
現在の自動インクリメント値をリセットするには:
ALTER TABLE t1 AUTO_INCREMENT = 13;
このカウンタを、現在使用されている値以下の値にリセットすることはできません。
InnoDB
とMyISAM
のどちらの場合も、この値が現在AUTO_INCREMENT
カラム内にある最大値以下である場合、この値は現在のAUTO_INCREMENT
カラムの最大値に 1 を加えた値にリセットされます。 -
デフォルトのテーブルの文字セットを変更するには:
ALTER TABLE t1 CHARACTER SET = utf8;
文字セットの変更も参照してください。
-
テーブルコメントを追加 (または変更) するには:
ALTER TABLE t1 COMMENT = 'New table comment';
-
既存の general tablespaces、file-per-table テーブルスペースおよび system tablespace 間で
InnoDB
テーブルを移動するには、TABLESPACE
オプションを指定してALTER TABLE
を使用します。 ALTER TABLE を使用したテーブルスペース間のテーブルの移動を参照してください。ALTER TABLE ... TABLESPACE
操作では、TABLESPACE
属性が以前の値から変更されていない場合でも、常に全テーブルが再構築されます。ALTER TABLE ... TABLESPACE
構文では、一時テーブルスペースから永続テーブルスペースへのテーブルの移動はサポートされていません。CREATE TABLE ... TABLESPACE
でサポートされているDATA DIRECTORY
句は、ALTER TABLE ... TABLESPACE
ではサポートされず、指定されている場合は無視されます。TABLESPACE
オプションの機能および制限の詳細は、CREATE TABLE
を参照してください。
-
MySQL NDB Cluster 8.0 は、次の例に示すように、
ALTER TABLE
ステートメントのテーブルコメントの一部として、テーブルパーティションバランス (フラグメントカウントタイプ)、read-from-any-replica 機能、フルレプリケーション、またはこれらの任意の組み合わせをCREATE TABLE
と同じ方法で制御するためのNDB_TABLE
オプションの設定をサポートしています:ALTER TABLE t1 COMMENT = "NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RA_BY_NODE";
ALTER TABLE ... COMMENT ...
では、テーブルの既存のコメントはすべて破棄されることに注意してください。 追加情報および例については、「NDB_TABLE の設定」オプションを参照してください。 ENGINE_ATTRIBUTE
およびSECONDARY_ENGINE_ATTRIBUTE
オプション (MySQL 8.0.21 の時点で使用可能) は、プライマリおよびセカンダリストレージエンジンのテーブル、カラム、およびインデックス属性を指定するために使用されます。 オプションは、将来の使用のために予約されています。 インデックス属性は変更できません。 インデックスを削除し、必要な変更を加えて再度追加する必要があります。これは、単一のALTER TABLE
ステートメントで実行できます。
テーブルオプションが意図したとおりに変更されたことを確認するには、SHOW CREATE TABLE
を使用するか、INFORMATION_SCHEMA.TABLES
テーブルをクエリーします。
パフォーマンスおよび領域要件
ALTER TABLE
操作は、次のいずれかのアルゴリズムを使用して処理されます:
COPY
: 操作は元のテーブルのコピーに対して実行され、テーブルデータは元のテーブルから新しいテーブルの行ごとにコピーされます。 同時 DML は許可されません。INPLACE
: 操作ではテーブルデータのコピーは回避されますが、テーブルが適切に再構築される可能性があります。 操作の準備フェーズおよび実行フェーズでは、テーブルに対する排他的メタデータロックが短時間で取得される場合があります。 通常、同時 DML はサポートされています。INSTANT
: 操作では、データディクショナリ内のメタデータのみが変更されます。 準備および実行中にテーブルに対する排他的メタデータロックは行われず、テーブルデータは影響を受けず、操作が即時に行われます。 同時 DML が許可されます。 (MySQL 8.0.12 で導入)
ALGORITHM
句はオプションです。 ALGORITHM
句を省略すると、MySQL では、ストレージエンジンおよびそれをサポートする ALTER TABLE
句に ALGORITHM=INSTANT
が使用されます。 それ以外の場合は、ALGORITHM=INPLACE
が使用されます。 ALGORITHM=INPLACE
がサポートされていない場合、ALGORITHM=COPY
が使用されます。
ALGORITHM
句を指定するには、それをサポートする句およびストレージエンジンに指定されたアルゴリズムを使用する操作が必要です。そうしないと、エラーで失敗します。 ALGORITHM=DEFAULT
を指定することは、ALGORITHM
句を省略することと同じです。
COPY
アルゴリズムを使用する ALTER TABLE
操作は、テーブルを変更している他の操作が完了するまで待機します。 変更がテーブルコピーに適用されると、データがコピーされ、元のテーブルが削除され、テーブルコピーの名前が元のテーブルの名前に変更されます。 ALTER TABLE
操作の実行中、元のテーブルは他のセッションで読取り可能です (ただし、すぐに記載されている例外があります)。 ALTER TABLE
操作の開始後に開始されたテーブルの更新および書込みは、新しいテーブルの準備ができるまで停止され、新しいテーブルに自動的にリダイレクトされます。 テーブルの一時コピーは、別のディレクトリに存在するデータベースにテーブルを移動する RENAME TO
操作でないかぎり、元のテーブルのデータベースディレクトリに作成されます。
前述の例外は、古いテーブル構造をテーブルおよびテーブル定義キャッシュからクリアする準備が整った時点で、ALTER TABLE
が読取り (書込みのみではなく) をブロックすることです。 この時点で、このステートメントは排他的ロックを取得する必要があります。 これを行うには、現在のリーダーが終了するまで待機し、新しい読取りおよび書込みをブロックします。
COPY
アルゴリズムを使用する ALTER TABLE
操作により、同時 DML 操作が防止されます。 並列クエリーは、引き続き許可されます。 つまり、テーブルコピー操作には常に、少なくとも LOCK=SHARED
(クエリーを許可するが、DML は許可しない) の並列性の制限が含まれます。 DML およびクエリーを防止する LOCK=EXCLUSIVE
を指定することで、LOCK
句をサポートする操作の同時実行性をさらに制限できます。 詳細は、同時実行性制御を参照してください。
それ以外の場合は使用しない ALTER TABLE
操作に COPY
アルゴリズムを強制的に使用するには、ALGORITHM=COPY
を指定するか、old_alter_table
システム変数を有効にします。 old_alter_table
設定と、DEFAULT
以外の値を持つ ALGORITHM
句の間に矛盾がある場合は、ALGORITHM
句が優先されます。
InnoDB
テーブルの場合、shared tablespace に存在するテーブルで COPY
アルゴリズムを使用する ALTER TABLE
操作によって、テーブルスペースで使用される領域の量が増加する可能性があります。 このような操作には、テーブルのデータとインデックスと同じ追加領域が必要です。 共有テーブルスペースに存在するテーブルの場合、操作中に使用された追加領域は、file-per-table テーブルスペースに存在するテーブル用であるため、オペレーティングシステムに解放されません。
オンライン DDL 操作の領域要件の詳細は、セクション15.12.3「オンライン DDL 領域の要件」 を参照してください。
INPLACE
アルゴリズムをサポートする ALTER TABLE
操作には、次のものがあります:
InnoDB
online DDL 機能でサポートされているALTER TABLE
操作。 セクション15.12.1「オンライン DDL 操作」を参照してください。テーブルの名前の変更。 MySQL は、コピーを作成せずに、テーブル
tbl_name
に対応するファイルの名前を変更します。 (RENAME TABLE
ステートメントを使用してテーブルの名前を変更することもできます。 セクション13.1.36「RENAME TABLE ステートメント」を参照してください。) 名前を変更したテーブル専用に付与された権限は、新しい名前に移行されません。 それらは、手動で変更する必要があります。-
テーブルメタデータのみを変更する操作。 サーバーがテーブルの内容に触れないため、これらの操作はすぐに行われます。 メタデータのみの操作には次のものがあります:
カラム名の変更。 NDB Cluster 8.0.18 以降では、この操作をオンラインで実行することもできます。
カラムのデフォルト値の変更 (
NDB
テーブルを除く)。データ型の記憶域サイズが変更されないかぎり、新しい列挙を追加するか、有効なメンバー値のリストの end にメンバーを設定して、
ENUM
またはSET
カラムの定義を変更します。 たとえば、8 つのメンバーを持つSET
カラムにメンバーを追加すると、値ごとに必要な記憶域が 1 バイトから 2 バイトに変更されます。これにはテーブルのコピーが必要です。 リストの途中にメンバーを追加すると、既存のメンバーの番号が変更されます。これには、テーブルコピーが必要になります。空間カラムの定義を変更して、
SRID
属性を削除します。 (SRID
属性を追加または変更するには再構築が必要であり、サーバーはすべての値に指定された SRID 値があることを確認する必要があるため、再構築を実行できません。)-
MySQL 8.0.14 では、次の条件が適用される場合にカラムの文字セットを変更します:
カラムのデータ型は、
CHAR
、VARCHAR
、TEXT
型またはENUM
です。文字セットの変更は、
utf8mb3
からutf8mb4
へ、または任意の文字セットからbinary
へです。カラムにインデックスがありません。
-
MySQL 8.0.14 では、次の条件が適用される場合、生成されたカラムを変更します:
InnoDB
テーブルの場合、生成されたストアドカラムを変更するが、その型、式または NULL 値可能性は変更しないステートメント。InnoDB
以外のテーブルの場合、生成されたストアドカラムまたは仮想カラムを変更するが、型、式または NULL 値可能性は変更しないステートメント。
このような変更の例として、カラムコメントの変更があります。
インデックスの名前変更。
InnoDB
およびNDB
テーブルのセカンダリインデックスの追加または削除。 セクション15.12.1「オンライン DDL 操作」を参照してください。NDB
テーブルの場合、可変幅のカラムに対してインデックスを追加および削除する操作。 これらの操作は、テーブルのコピーなし、および同時 DML アクションをブロックせずに、ほとんどの期間オンラインで実行されます。 セクション23.5.11「NDB Cluster での ALTER TABLE を使用したオンライン操作」を参照してください。ALTER INDEX
操作によるインデックスの可視性の変更。変更されたカラムが生成されたカラム式に含まれていない場合に、
DEFAULT
値を持つカラムに依存する生成されたカラムを含むテーブルのカラムの変更。 たとえば、テーブルを再構築せずに、別のカラムのNULL
プロパティを変更できます。
INSTANT
アルゴリズムをサポートする ALTER TABLE
操作には、次のものがあります:
カラムの追加。 この機能は、「「インスタント
ADD COLUMN
」」と呼ばれます。 制限が適用されます。 セクション15.12.1「オンライン DDL 操作」を参照してください。仮想カラムの追加または削除。
カラムのデフォルト値の追加または削除。
ENUM
またはSET
カラムの定義の変更。 前述のALGORITHM=INSTANT
の場合と同じ制限が適用されます。インデックスタイプの変更。
テーブルの名前の変更。 前述の
ALGORITHM=INSTANT
の場合と同じ制限が適用されます。
ALGORITHM=INSTANT
をサポートする操作の詳細は、セクション15.12.1「オンライン DDL 操作」 を参照してください。
ALTER TABLE
は、ADD COLUMN
, CHANGE COLUMN
, MODIFY COLUMN
, ADD INDEX
および FORCE
操作のために、MySQL 5.5 一時カラムを 5.6 形式にアップグレードします。 テーブルを再構築しなければならないため、この変換は INPLACE
アルゴリズムを使用して実行することはできません。そのため、これらの場合に ALGORITHM=INPLACE
を指定するとエラーになります。 必要であれば、ALGORITHM=COPY
を指定します。
KEY
によってテーブルをパーティション化するために使用される複数カラムインデックスに対する ALTER TABLE
操作によってカラムの順序が変更される場合は、ALGORITHM=COPY
を使用してのみ実行できます。
WITHOUT VALIDATION
句および WITH VALIDATION
句は、ALTER TABLE
が virtual generated column の変更に対してインプレース操作を実行するかどうかに影響します。 セクション13.1.9.2「ALTER TABLE および生成されるカラム」を参照してください。
NDB Cluster 8.0 は、標準 MySQL Server で使用されるものと同じ ALGORITHM=INPLACE
構文を使用したオンライン操作をサポートします。 NDB
はオンラインでのテーブルスペースの変更をサポートしていません。NDB 8.0.21 以降では許可されません。 詳しくはセクション23.5.11「NDB Cluster での ALTER TABLE を使用したオンライン操作」,をご覧ください。
DISCARD ... PARTITION ... TABLESPACE
または IMPORT ... PARTITION ... TABLESPACE
を使用した ALTER TABLE
では、一時テーブルまたは一時パーティションファイルは作成されません。
ALTER TABLE
with ADD PARTITION
, DROP PARTITION
, COALESCE PARTITION
, REBUILD PARTITION
または REORGANIZE PARTITION
では、一時テーブルは作成されません (NDB
テーブルとともに使用する場合を除く)。ただし、これらの操作では一時パーティションファイルを作成でき、作成できます。
RANGE
または LIST
パーティションに対する ADD
または DROP
操作は即座の操作か、ほぼ即座の操作です。 HASH
または KEY
パーティションに対する ADD
または COALESCE
操作では、LINEAR HASH
または LINEAR KEY
が使用されていないかぎり、すべてのパーティション間でデータがコピーされます。ADD
または COALESCE
操作はパーティションごとに実行されますが、これは実質的に、新しいテーブルの作成と同じです。 REORGANIZE
操作では変更されたパーティションのみがコピーされ、変更されていないものはそのままです。
MyISAM
テーブルの場合は、myisam_sort_buffer_size
システム変数を大きな値に設定することによって、インデックスの再作成 (変更プロセスのもっとも遅い部分) を高速化できます。
同時実行性制御
これをサポートする ALTER TABLE
操作の場合は、LOCK
句を使用して、テーブルの変更中の同時読取りおよび書込みのレベルを制御できます。 この句にデフォルト以外の値を指定すると、変更操作中に特定の量の同時アクセスまたは排他性を必要とし、リクエストされたロックの程度が使用できない場合は操作を停止できます。
ALGORITHM=INSTANT
を使用する操作には、LOCK = DEFAULT
のみが許可されます。 その他の LOCK
句パラメータは適用できません。
LOCK
句のパラメータは次のとおりです。
-
LOCK = DEFAULT
指定された
ALGORITHM
句 (存在する場合) およびALTER TABLE
操作に対する最大レベルの並列性: サポートされている場合は、並列読み取りおよび書き込みを許可します。 そうでない場合、サポートされている場合は、並列読み取りを許可します。 そうでない場合は、排他的アクセスを適用します。 -
LOCK = NONE
サポートされている場合は、並列読み取りおよび書き込みを許可します。 それ以外の場合は、エラーが発生します。
-
LOCK = SHARED
サポートされている場合は、並列読み取りを許可しますが、書き込みはブロックします。 ストレージエンジンが指定された
ALGORITHM
句 (存在する場合) およびALTER TABLE
操作に対して同時書き込みをサポートしている場合でも、書き込みはブロックされます。 同時読取りがサポートされていない場合は、エラーが発生します。 -
LOCK = EXCLUSIVE
排他的アクセスを適用します。 これは、指定された
ALGORITHM
句 (存在する場合) およびALTER TABLE
操作について、ストレージエンジンによって同時読み取り/書き込みがサポートされている場合でも実行されます。
カラムの追加および削除
ADD
を使用してテーブルに新しいカラムを追加し、DROP
を使用して既存のカラムを削除します。 DROP
は、標準 SQL に対する MySQL の拡張機能です。
col_name
テーブル行内の特定の位置にカラムを追加するには、FIRST
または AFTER
を使用します。 デフォルトでは、そのカラムを最後に追加します。
col_name
テーブルに 1 つのカラムしか含まれていない場合は、そのカラムを削除できません。 テーブルを削除する場合は、かわりに DROP TABLE
ステートメントを使用します。
テーブルからカラムが削除された場合、そのカラムは、それが含まれているすべてのインデックスからも削除されます。 インデックスを構成するすべてのカラムが削除された場合は、そのインデックスも削除されます。 CHANGE
または MODIFY
を使用して、インデックスが存在するカラムを短くしたときに、結果として得られるカラムの長さがインデックスの長さより短くなった場合、MySQL は自動的にそのインデックスを短くします。
ALTER TABLE ... ADD
では、カラムに非決定的関数を使用する式のデフォルト値がある場合、ステートメントによって警告またはエラーが生成されることがあります。 詳細は、セクション11.6「データ型デフォルト値」 および セクション17.1.3.7「GTID ベースレプリケーションの制約」 を参照してください。
カラムの名前変更、再定義および並替え
CHANGE
, MODIFY
, RENAME COLUMN
句および ALTER
句を使用すると、既存のカラムの名前および定義を変更できます。 これらには次のような比較特性があります:
-
CHANGE
:カラムの名前を変更し、その定義を変更するか、その両方を行うことができます。
MODIFY
またはRENAME COLUMN
よりも多くの機能を備えていますが、一部の操作には便宜上役立ちます。CHANGE
では、名前を変更しない場合はカラムの名前を 2 回指定する必要があり、名前の変更のみの場合はカラム定義を再指定する必要があります。FIRST
またはAFTER
では、カラムを並べ替えることができます。
-
MODIFY
:カラム定義は変更できますが、名前は変更できません。
CHANGE
よりも、名前を変更せずにカラム定義を変更する方が便利です。FIRST
またはAFTER
では、カラムを並べ替えることができます。
-
RENAME COLUMN
:カラム名は変更できますが、その定義は変更できません。
CHANGE
よりも、定義を変更せずにカラムの名前を変更する方が便利です。
ALTER
: カラムのデフォルト値を変更するためにのみ使用されます。
CHANGE
は、標準 SQL に対する MySQL の拡張機能です。 MODIFY
および RENAME COLUMN
は、Oracle との互換性のための MySQL の拡張機能です。
カラムを変更してその名前と定義の両方を変更するには、古い名前と新しい名前、および新しい定義を指定して CHANGE
を使用します。 たとえば、INT NOT NULL
カラムの名前を a
から b
に変更し、NOT NULL
属性を保持したまま BIGINT
データ型を使用するようにその定義を変更するには、次のようにします:
ALTER TABLE t1 CHANGE a b BIGINT NOT NULL;
名前ではなくカラム定義を変更するには、CHANGE
または MODIFY
を使用します。 CHANGE
では、構文に 2 つのカラム名が必要であるため、名前を変更せずに同じ名前を 2 回指定する必要があります。 たとえば、カラム b
の定義を変更するには、次のようにします:
ALTER TABLE t1 CHANGE b b INT NOT NULL;
MODIFY
では、カラム名が必要になるのは一度のみであるため、名前を変更せずに定義を変更する方が便利です:
ALTER TABLE t1 MODIFY b INT NOT NULL;
カラム名を変更するが、その定義は変更しない場合は、CHANGE
または RENAME COLUMN
を使用します。 CHANGE
では、構文にカラム定義が必要であるため、定義を変更しないでおくには、カラムに現在設定されている定義を再指定する必要があります。 たとえば、INT NOT NULL
カラムの名前を b
から a
に変更するには、次のようにします:
ALTER TABLE t1 CHANGE b a INT NOT NULL;
RENAME COLUMN
では、古い名前と新しい名前のみが必要なため、定義を変更せずに名前を変更する方が便利です:
ALTER TABLE t1 RENAME COLUMN b TO a;
一般に、カラムの名前をテーブルにすでに存在する名前に変更することはできません。 ただし、名前を入れ替えたりサイクル内で移動したりする場合などには、これは当てはまらないことがあります。 テーブルに a
、b
および c
という名前のカラムがある場合、これらは有効な操作です:
-- swap a and b
ALTER TABLE t1 RENAME COLUMN a TO b,
RENAME COLUMN b TO a;
-- "rotate" a, b, c through a cycle
ALTER TABLE t1 RENAME COLUMN a TO b,
RENAME COLUMN b TO c,
RENAME COLUMN c TO a;
CHANGE
または MODIFY
を使用してカラム定義を変更する場合、PRIMARY KEY
や UNIQUE
などのインデックス属性以外の、新しいカラムに適用するデータ型およびすべての属性を定義に含める必要があります。 元の定義には存在するが、新しい定義として指定されていない属性は引き継がれません。 カラム col1
が INT UNSIGNED DEFAULT 1 COMMENT 'my column'
として定義されており、カラムを次のように変更して、INT
のみを BIGINT
に変更するとします:
ALTER TABLE t1 MODIFY col1 BIGINT;
このステートメントは、データ型を INT
から BIGINT
に変更しますが、UNSIGNED
、DEFAULT
および COMMENT
属性も削除します。 これらを保持するには、ステートメントに明示的に含める必要があります:
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
CHANGE
または MODIFY
を使用してデータ型を変更する場合、MySQL は既存のカラム値を可能なかぎり新しい型に変換しようとします。
この変換によって、データが変更される可能性があります。 たとえば、文字列カラムを短くすると、値が切り捨てられる可能性があります。 新しいデータ型への変換によってデータが失われる場合は操作が成功しないようにするには、ALTER TABLE
を使用する前に厳密な SQL モードを有効にします (セクション5.1.11「サーバー SQL モード」を参照してください)。
CHANGE
または MODIFY
を使用して、インデックスが存在するカラムを短くしたときに、結果として得られるカラムの長さがインデックスの長さより短くなった場合、MySQL は自動的にそのインデックスを短くします。
CHANGE
または RENAME COLUMN
によって名前が変更されたカラムの場合、MySQL は、これらの参照の名前を名前が変更されたカラムに自動的に変更します:
非表示インデックスや無効化された
MyISAM
インデックスなど、古いカラムを参照するインデックス。古いカラムを参照する外部キー。
CHANGE
または RENAME COLUMN
によって名前が変更されたカラムの場合、MySQL は、名前が変更されたカラムへの次の参照の名前を自動的に変更しません:
名前が変更されたカラムを参照する生成されたカラムおよびパーティション式。
CHANGE
を使用して、カラムの名前を変更するものと同じALTER TABLE
ステートメントでこのような式を再定義する必要があります。名前が変更されたカラムを参照するビューおよびストアドプログラム。 これらのオブジェクトの定義は、新しいカラム名を参照するように手動で変更する必要があります。
テーブル内のカラムを並べ替えるには、CHANGE
または MODIFY
操作で FIRST
および AFTER
を使用します。
ALTER ... SET DEFAULT
または ALTER ... DROP DEFAULT
は、それぞれカラムに新しいデフォルト値を指定するか、古いデフォルト値を削除します。 古いデフォルトが削除され、かつカラムを NULL
にできる場合、新しいデフォルトは NULL
です。 カラムを NULL
にできない場合、MySQL は、セクション11.6「データ型デフォルト値」で説明されているようにデフォルト値を割り当てます。
MySQL 8.0.23 では、ALTER ... SET VISIBLE
および ALTER ... SET INVISIBLE
を使用してカラムの可視性を変更できます。 セクション13.1.20.10「非表示カラム」を参照してください。
主キーとインデックス
DROP PRIMARY KEY
により、primary key が削除されます。 主キーが存在しない場合は、エラーが発生します。 主キーのパフォーマンス特性 (特に InnoDB
テーブルの場合) については、セクション8.3.2「主キーの最適化」を参照してください。
sql_require_primary_key
システム変数が有効になっている場合、主キーを削除しようとするとエラーが発生します。
テーブルに UNIQUE INDEX
または PRIMARY KEY
を追加すると、重複キーをできるだけ早く検出できるようにするために、MySQL はそれを一意でないどのインデックスよりも前に格納します。
DROP INDEX
はインデックスを削除します。 これは、標準 SQL への MySQL 拡張です。 セクション13.1.27「DROP INDEX ステートメント」を参照してください。 インデックス名を確認するには、SHOW INDEX FROM
を使用します。
tbl_name
一部のストレージエンジンでは、インデックスの作成時にインデックスタイプを指定できます。 index_type
指定子の構文は、USING
です。 type_name
USING
の詳細は、セクション13.1.15「CREATE INDEX ステートメント」を参照してください。 推奨される位置は、カラムリストのあとです。 将来の MySQL リリースでは、カラムリストの前にオプションの使用がサポートされることが期待されます。
index_option
値は、インデックスの追加オプションを指定します。 USING
はそのようなオプションの 1 つです。 許可される index_option
値の詳細は、セクション13.1.15「CREATE INDEX ステートメント」を参照してください。
RENAME INDEX
は、インデックスの名前を変更します。 これは、標準 SQL への MySQL 拡張です。 テーブルの内容は変更されません。old_index_name
TO new_index_name
old_index_name
は、同じ ALTER TABLE
ステートメントで削除されないテーブル内の既存のインデックスの名前である必要があります。new_index_name
は新しいインデックス名で、変更が適用された後に結果テーブルのインデックスの名前を複製することはできません。 どちらのインデックス名も PRIMARY
にできません。
MyISAM
テーブルで ALTER TABLE
を使用する場合は、(REPAIR TABLE
の場合と同様に) 一意でないすべてのインデックスが個別のバッチで作成されます。 多くのインデックスがあるときは、この方法で ALTER TABLE
がはるかに早くなります。
MyISAM
テーブルの場合は、キーの更新を明示的に制御できます。 ALTER TABLE ... DISABLE KEYS
を使用して、一意でないインデックスの更新を停止するよう MySQL に指示します。 次に、ALTER TABLE ... ENABLE KEYS
を使用して、不足しているインデックスを再作成します。 MyISAM
はこれを、キーを 1 つずつ挿入するのに比べてはるかに高速な特殊なアルゴリズムで実行するため、一括挿入操作を実行する前にキーを無効にすると大幅な高速化が得られます。 ALTER TABLE ... DISABLE KEYS
を使用するには、先に説明した権限に加えて INDEX
権限が必要です。
一意でないインデックスは、無効になっている間、有効なときにはこのインデックスを使用する SELECT
や EXPLAIN
などのステートメントで無視されます。
ALTER TABLE
ステートメントのあとに、インデックスカーディナリティー情報を更新するために ANALYZE TABLE
の実行が必要になることがあります。 セクション13.7.7.22「SHOW INDEX ステートメント」を参照してください。
ALTER INDEX
操作では、インデックスを可視または不可視にできます。 不可視インデックスはオプティマイザでは使用されません。 インデックスの可視性の変更は、主キー以外のインデックス (明示的または暗黙的) に適用されます。 この機能はストレージエンジンに依存しません (すべてのエンジンでサポートされています)。 詳細は、セクション8.3.12「不可視のインデックス」を参照してください。
外部キーおよびその他の制約
FOREIGN KEY
および REFERENCES
句は、ADD [CONSTRAINT [
を実装する symbol
]] FOREIGN KEY [index_name
] (...) REFERENCES ... (...)InnoDB
および NDB
ストレージエンジンによってサポートされます。 セクション13.1.20.5「FOREIGN KEY の制約」を参照してください。 その他のストレージエンジンでは、これらの句は解析されますが、無視されます。
ALTER TABLE
では、CREATE TABLE
とは異なり、ADD FOREIGN KEY
は index_name
(指定されている場合) を無視し、自動的に生成された外部キー名を使用します。 回避方法として、外部キー名を指定する CONSTRAINT
句を含めます。
ADD CONSTRAINT name FOREIGN KEY (....) ...
MySQL では、参照がカラム指定の一部として定義されているインライン REFERENCES
指定は暗黙的に無視されます。 MySQL は、個別の FOREIGN KEY
仕様の一部として定義された REFERENCES
句のみを受け入れます。
パーティション化された InnoDB
テーブルは、外部キーをサポートしていません。 この制限は、NDB
テーブル ([LINEAR] KEY
によって明示的にパーティション化されたテーブルを含む) には適用されません。 詳細は、セクション24.6.2「ストレージエンジンに関連するパーティショニング制限」を参照してください。
MySQL Server と NDB Cluster はどちらも、ALTER TABLE
を使用した外部キーの削除をサポートしています:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
同じ ALTER TABLE
ステートメントでの外部キーの追加および削除は、ALTER TABLE ... ALGORITHM=INPLACE
ではサポートされていますが、ALTER TABLE ... ALGORITHM=COPY
ではサポートされていません。
サーバーは、参照整合性が失われる可能性がある外部キーカラムの変更を禁止します。 回避方法として、カラム定義を変更する前に ALTER TABLE ... DROP FOREIGN KEY
を使用し、あとで ALTER TABLE ... ADD FOREIGN KEY
を使用します。 禁止されている変更の例を次に示します:
安全でない可能性がある外部キーカラムのデータ型に対する変更。 たとえば、
VARCHAR(20)
のVARCHAR(30)
への変更は許可されますが、それをVARCHAR(1024)
に変更することは、それによって個々の値を格納するために必要なバイト長の数が変更されるため許可されません。非制限モードで
NULL
カラムをNOT NULL
に変更することは、参照テーブルに対応する値がないデフォルトのNULL
以外の値へのNULL
値の変換を防ぐために禁止されています。 この操作は厳密モードでは許可されますが、このような変換が必要な場合はエラーが返されます。
ALTER TABLE
は、内部的に生成された外部キー制約名および文字列 「tbl_name
RENAME new_tbl_name
tbl_name
_ibfk_」で始まるユーザー定義の外部キー制約名を、新しいテーブル名を反映するように変更します。 InnoDB
は、文字列 「tbl_name
_ibfk_」で始まる外部キー制約名を内部的に生成された名前と解釈します。
MySQL 8.0.16 より前の ALTER TABLE
では、次の限定バージョンの CHECK
制約追加構文のみが許可されていました。この構文は解析され、無視されます:
ADD CHECK (expr)
MySQL 8.0.16 の時点で、ALTER TABLE
では、既存のテーブルの CHECK
制約を追加、削除または変更できます:
-
新しい
CHECK
制約を追加します:ALTER TABLE tbl_name ADD CONSTRAINT [symbol] CHECK (expr) [[NOT] ENFORCED];
制約構文要素の意味は、
CREATE TABLE
の場合と同じです。 セクション13.1.20.6「CHECK 制約」を参照してください。 -
symbol
という名前の既存のCHECK
制約を削除します:ALTER TABLE tbl_name DROP CHECK symbol;
-
symbol
という名前の既存のCHECK
制約が施行されるかどうかを変更します:ALTER TABLE tbl_name ALTER CHECK symbol [NOT] ENFORCED;
DROP CHECK
句および ALTER CHECK
句は、標準 SQL に対する MySQL の拡張機能です。
MySQL 8.0.19 の時点で、ALTER TABLE
では、制約タイプが制約名から決定される任意のタイプの既存の制約を削除および変更するために、より一般的な (および SQL 標準の) 構文を使用できます:
-
symbol
という名前の既存の制約を削除します:ALTER TABLE tbl_name DROP CONSTRAINT symbol;
sql_require_primary_key
システム変数が有効になっている場合、主キーを削除しようとするとエラーが発生します。 -
symbol
という名前の既存の制約を施行するかどうかを変更します:ALTER TABLE tbl_name ALTER CONSTRAINT symbol [NOT] ENFORCED;
CHECK
制約のみ変更して強制終了できます。 他のすべての制約タイプは常に適用されます。
SQL 標準では、すべてのタイプの制約 (主キー、一意インデックス、外部キー、チェック) が同じネームスペースに属することが指定されています。 MySQL では、各制約タイプにスキーマごとに独自のネームスペースがあります。 したがって、各タイプの制約の名前はスキーマごとに一意である必要がありますが、異なるタイプの制約には同じ名前を付けることができます。 複数の制約の名前が同じ場合、DROP CONSTRAINT
と ADD CONSTRAINT
はあいまいであり、エラーが発生します。 このような場合は、制約固有の構文を使用して制約を変更する必要があります。 たとえば、主キーまたは外部キーを削除するには、DROP PRIMARY KEY
または DROP FOREIGN KEY を使用します。
テーブルの変更によって CHECK
制約の施行違反が発生した場合、エラーが発生し、テーブルは変更されません。 エラーが発生した操作の例:
CHECK
制約で使用されるカラムにAUTO_INCREMENT
属性を追加しようとします。施行された
CHECK
制約を追加しようとするか、既存の行が制約条件に違反している非施行CHECK
制約を施行しようとします。CHECK
制約で使用されているカラムを変更、名前変更または削除しようとします。ただし、その制約が同じステートメントでも削除されている場合を除きます。 例外:CHECK
制約が単一のカラムのみを参照する場合、そのカラムを削除すると制約が自動的に削除されます。
ALTER TABLE
は、新しいテーブル名を反映するために、文字列 「tbl_name
RENAME new_tbl_name
tbl_name
_chk_」で始まる内部生成およびユーザー定義の CHECK
制約名を変更します。 MySQL は、文字列 「tbl_name
_chk_」で始まる CHECK
制約名を内部的に生成された名前と解釈します。
文字セットの変更
テーブルのデフォルトの文字セットおよびすべての文字カラム (CHAR
、VARCHAR
、TEXT
) を新しい文字セットに変更するには、次のようなステートメントを使用します。
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
このステートメントでは、すべての文字カラムの照合順序も変更されます。 使用する照合順序を示す COLLATE
句を指定しない場合、このステートメントは、その文字セットのデフォルトの照合順序を使用します。 この照合順序が目的とするテーブル使用に適していない (たとえば、大文字と小文字が区別される照合順序から大文字と小文字が区別されない照合順序に変更されてしまう) 場合は、照合順序を明示的に指定します。
VARCHAR
のデータ型または TEXT
型のいずれかを持つカラムの場合、CONVERT TO CHARACTER SET
は必要に応じてデータ型を変更し、新しいカラムが元のカラムと同じ数の文字を格納できる長さになるようにします。 たとえば、TEXT
カラムには、そのカラム内の値のバイト長 (最大 65,535) を格納するための 2 バイト長があります。 latin1
TEXT
カラムの場合は、各文字に 1 バイトが必要なため、このカラムには最大 65,535 文字を格納できます。 このカラムが utf8
に変換された場合は、各文字に最大 3 バイトが必要になる可能性があるため、可能性のある最大の長さは 3 × 65,535 = 196,605 バイトになります。 この長さは TEXT
カラムの長さバイトに収まらないため、MySQL はデータ型を MEDIUMTEXT
に変換します。これは、長さバイトが 196,605 の値を記録できる最小の文字列型です。 同様に、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
操作は適用されません。
CONVERT TO CHARACTER SET
操作で charset_name
が DEFAULT
の場合は、character_set_database
システム変数で指定された文字セットが使用されます。
CONVERT TO
操作は、元の文字セットと名前付き文字セットの間でカラム値を変換します。 これは、ある文字セット (latin1
など) のカラムがあるが、格納された値が実際には、ほかの何らかの互換性のない文字セット (utf8
など) を使用している場合に必要なものではありません。 この場合は、このようなカラムごとに、次を実行する必要があります。
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
これが機能する理由は、BLOB
カラムとの間で変換する場合は変換が発生しないためです。
テーブルのデフォルトの文字セットのみを変更するには、次のステートメントを使用します。
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
ワード DEFAULT
はオプションです。 デフォルトの文字セットは、あとで (たとえば、ALTER TABLE ... ADD column
で) テーブルに追加するカラムの文字セットを指定しない場合に使用される文字セットです。
foreign_key_checks
システム変数 (デフォルト設定) が有効な場合、外部キー制約で使用される文字列カラムを含むテーブルでは文字セット変換は許可されません。 回避策は、文字セット変換を実行する前に foreign_key_checks
を無効にすることです。 foreign_key_checks
を再度有効にする前に、外部キー制約に関係する両方のテーブルで変換を実行する必要があります。 いずれかのテーブルのみを変換した後に foreign_key_checks
を再度有効にすると、これらの操作中に暗黙的に変換されるために、ON DELETE CASCADE
または ON UPDATE CASCADE
操作によって参照テーブルのデータが破損する可能性があります (Bug #45290、Bug #74816)。
InnoDB テーブルのインポート
独自の file-per-table テーブルスペースで作成された InnoDB
テーブルは、DISCARD TABLEPACE
句および IMPORT TABLESPACE
句を使用して、バックアップまたは別の MySQL サーバーインスタンスからインポートできます。 セクション15.6.1.3「InnoDB テーブルのインポート」を参照してください。
MyISAM テーブルの行順序
ORDER BY
では、特定の順序で行を含む新しいテーブルを作成できます。 このオプションは、ほとんどの場合、特定の順序で行をクエリーすることがわかっている場合に主に役立ちます。 このオプションをテーブルの大幅な変更のあとに使用すると、パフォーマンスの向上が得られる可能性があります。 場合によっては、テーブルが、あとでその並べ替えに使用するカラムごとの順番になっていれば、MySQL でのソートが簡単になることがあります。
挿入や削除を行うと、このテーブルは指定された順序のままではなくなります。
ORDER BY
構文では、ソートのためのカラム名を 1 つ以上指定できます。その各カラム名に続けて、オプションで、それぞれ昇順または降順のソート順序を示す ASC
または DESC
を指定できます。 デフォルトは昇順です。 ソート条件として許可されるのはカラム名だけです。任意の式は許可されていません。 この句は、ほかのどの句よりもあとの最後に指定するようにしてください。
InnoDB
は常に、クラスタ化されたインデックスに従ってテーブル行を並べ替えるため、ORDER BY
は InnoDB
テーブルでは意味がありません。
パーティション化されたテーブルに対して使用されている場合、ALTER TABLE ... ORDER BY
は、各パーティション内でのみ行を並べ替えます。
パーティショニングオプション
partition_options
は、パーティションの再パーティション化、パーティションの追加、削除、破棄、インポート、マージおよび分割、およびパーティション化メンテナンスの実行のためにパーティションテーブルで使用できるオプションを示します。
ALTER TABLE
ステートメントには、ほかの変更指定に加えて、PARTITION BY
または REMOVE PARTITIONING
句を含めることができますが、PARTITION BY
または REMOVE PARTITIONING
句は、ほかのどの指定よりもあとの最後に指定する必要があります。 リストされているオプションは個々のパーティションに作用するため、ADD PARTITION
, DROP PARTITION
, DISCARD PARTITION
, IMPORT PARTITION
, COALESCE PARTITION
, REORGANIZE PARTITION
, EXCHANGE PARTITION
, ANALYZE PARTITION
, CHECK PARTITION
および REPAIR PARTITION
オプションを単一の ALTER TABLE
内の他の変更指定と組み合せることはできません。
パーティションのオプションの詳細は、セクション13.1.20「CREATE TABLE ステートメント」およびセクション13.1.9.1「ALTER TABLE パーティション操作」を参照してください。 ALTER TABLE ... EXCHANGE PARTITION
ステートメントの詳細および例については、セクション24.3.3「パーティションとサブパーティションをテーブルと交換する」を参照してください。