Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.1Mb
HTML Download (TGZ) - 10.0Mb
HTML Download (Zip) - 10.1Mb


このページは機械翻訳したものです。

13.1.9 ALTER TABLE ステートメント

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 を使用するには、このテーブルに対する ALTERCREATE、および INSERT 権限が必要です。 テーブルを名前変更するには、古いテーブル側で ALTER および DROP と、新しいテーブル側で ALTERCREATE、および INSERT 権限が必要です。

  • テーブル名のあとに、行う変更を指定します。 何も指定されていない場合、ALTER TABLE は何もしません。

  • 許容される変更の多くの構文は、CREATE TABLE ステートメントの句と似ています。column_definition 句では、ADD および CHANGECREATE 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 AS type ARRAY) の形式でサポートしています。 複数値インデックスの作成と使用方法、および複数値インデックスの制限および制限の詳細は、複数値インデックス を参照してください。

  • mysql_info() C API 関数を使用すると、ALTER TABLE によってコピーされた行数を確認できます。 mysql_info()を参照してください。

このセクションの次のトピックで説明するように、ALTER TABLE ステートメントにはさらにいくつかの側面があります:

テーブルオプション

table_options は、ENGINE, AUTO_INCREMENT, AVG_ROW_LENGTH, MAX_ROWS, ROW_FORMATTABLESPACE などの CREATE TABLE ステートメントで使用できる種類のテーブルオプションを示します。

すべてのテーブルオプションの詳細は、セクション13.1.20「CREATE TABLE ステートメント」 を参照してください。 ただし、テーブルオプションとして指定されている場合、ALTER TABLEDATA 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 tbl_name ENGINE=INNODB を実行すると、null ALTER TABLE 操作が実行されます。これは、セクション15.11.4「テーブルのデフラグ」で説明されているように、InnoDB テーブルのデフラグに使用できます。 InnoDB テーブルに対して ALTER TABLE tbl_name FORCE を実行しても、同じ機能が実行されます。

    • ALTER TABLE tbl_name ENGINE=INNODB および ALTER TABLE tbl_name FORCE では、online DDL を使用します。 詳細は、セクション15.12「InnoDB とオンライン DDL」を参照してください。

    • テーブルのストレージエンジンを変更しようとした結果は、セクション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;

    このカウンタを、現在使用されている値以下の値にリセットすることはできません。 InnoDBMyISAM のどちらの場合も、この値が現在 AUTO_INCREMENT カラム内にある最大値以下である場合、この値は現在の AUTO_INCREMENT カラムの最大値に 1 を加えた値にリセットされます。

  • デフォルトのテーブルの文字セットを変更するには:

    ALTER TABLE t1 CHARACTER SET = utf8;

    文字セットの変更も参照してください。

  • テーブルコメントを追加 (または変更) するには:

    ALTER TABLE t1 COMMENT = 'New table comment';
  • 既存の general tablespacesfile-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 では、次の条件が適用される場合にカラムの文字セットを変更します:

      • カラムのデータ型は、CHARVARCHARTEXT 型または 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 TABLEvirtual 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 col_name は、標準 SQL に対する MySQL の拡張機能です。

テーブル行内の特定の位置にカラムを追加するには、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;

一般に、カラムの名前をテーブルにすでに存在する名前に変更することはできません。 ただし、名前を入れ替えたりサイクル内で移動したりする場合などには、これは当てはまらないことがあります。 テーブルに ab および 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 KEYUNIQUE などのインデックス属性以外の、新しいカラムに適用するデータ型およびすべての属性を定義に含める必要があります。 元の定義には存在するが、新しい定義として指定されていない属性は引き継がれません。 カラム col1INT UNSIGNED DEFAULT 1 COMMENT 'my column'として定義されており、カラムを次のように変更して、INT のみを BIGINT に変更するとします:

ALTER TABLE t1 MODIFY col1 BIGINT;

このステートメントは、データ型を INT から BIGINT に変更しますが、UNSIGNEDDEFAULT および 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 old_index_name TO new_index_name は、インデックスの名前を変更します。 これは、標準 SQL への MySQL 拡張です。 テーブルの内容は変更されません。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 権限が必要です。

一意でないインデックスは、無効になっている間、有効なときにはこのインデックスを使用する SELECTEXPLAIN などのステートメントで無視されます。

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 KEYindex_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 CONSTRAINTADD 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 制約名を内部的に生成された名前と解釈します。

文字セットの変更

テーブルのデフォルトの文字セットおよびすべての文字カラム (CHARVARCHARTEXT) を新しい文字セットに変更するには、次のようなステートメントを使用します。

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 を指定した場合、CHARVARCHAR、および TEXT カラムは、それぞれ対応するバイナリ文字列型 (BINARYVARBINARYBLOB) に変換されます。 つまり、カラムには文字セットがなくなり、後続の CONVERT TO 操作は適用されません。

CONVERT TO CHARACTER SET 操作で charset_nameDEFAULT の場合は、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 BYInnoDB テーブルでは意味がありません。

パーティション化されたテーブルに対して使用されている場合、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「パーティションとサブパーティションをテーブルと交換する」を参照してください。