MySQL 8.0 リファレンスマニュアル


13.1.9.2 ALTER TABLE および生成されるカラム

生成されるカラムに対して許可される ALTER TABLE 操作は、ADDMODIFY および CHANGE です。

  • 生成されたカラムを追加できます。

    CREATE TABLE t1 (c1 INT);
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 生成されたカラムのデータ型および式は変更できます。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 TINYINT GENERATED ALWAYS AS (c1 + 5) STORED;
  • 他のカラムが参照していない場合は、生成されたカラムの名前を変更または削除できます。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 CHANGE c2 c3 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    ALTER TABLE t1 DROP COLUMN c3;
  • 仮想生成カラムは、格納された生成カラムに変更できません。その逆も同様です。 これを回避するには、カラムを削除してから、新しい定義で追加します。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL);
    ALTER TABLE t1 DROP COLUMN c2;
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 非生成カラムは、格納済に変更できますが、仮想生成カラムには変更できません。

    CREATE TABLE t1 (c1 INT, c2 INT);
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
  • 格納されているが、仮想生成カラムは生成されていないカラムに変更できます。 格納された生成値は、生成されないカラムの値になります。

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 INT;
  • 式はサーバーによって評価される必要があるため、ADD COLUMN はストアドカラムのインプレース操作ではありません (一時テーブルを使用せずに実行されます)。 ストアドカラムの場合、インデックス付けの変更はインプレースで行われ、式の変更はインプレースでは行われません。 カラムコメントへの変更はインプレースで行われます。

  • パーティション化されていないテーブルの場合、ADD COLUMN および DROP COLUMN は仮想カラムのインプレース操作です。 ただし、仮想カラムの追加または削除は、他の ALTER TABLE 操作と組み合せて実行することはできません。

    パーティションテーブルの場合、ADD COLUMN および DROP COLUMN は仮想カラムのインプレース操作ではありません。

  • InnoDB では、仮想生成カラムのセカンダリインデックスがサポートされます。 仮想生成カラムに対するセカンダリインデックスの追加または削除はインプレース操作です。 詳細は、セクション13.1.20.9「セカンダリインデックスと生成されたカラム」を参照してください。

  • VIRTUAL で生成されたカラムがテーブルに追加または変更された場合、生成されたカラム式によって計算されるデータがカラムの範囲外であることは保証されません。 これにより、一貫性のないデータが返され、予期せず失敗したステートメントが発生する可能性があります。 このようなカラムに対して検証が行われるかどうかを制御できるように、ALTER TABLE では WITHOUT VALIDATION 句および WITH VALIDATION 句がサポートされています:

    • WITHOUT VALIDATION (どちらの句も指定されていない場合のデフォルト) では、インプレース操作が実行され (可能な場合)、データ整合性はチェックされず、ステートメントはより迅速に終了します。 ただし、後で値が範囲外の場合は、テーブルからの読取りでカラムの警告またはエラーが報告される可能性があります。

    • WITH VALIDATION では、ALTER TABLE によってテーブルがコピーされます。 範囲外のエラーまたはその他のエラーが発生した場合、ステートメントは失敗します。 テーブルのコピーが実行されるため、ステートメントに時間がかかります。

    WITHOUT VALIDATION および WITH VALIDATION は、ADD COLUMNCHANGE COLUMN および MODIFY COLUMN 操作でのみ許可されます。 それ以外の場合は、ER_WRONG_USAGE エラーが発生します。

  • 式の評価によって切捨てが発生した場合、または関数への入力が正しくない場合、ALTER TABLE ステートメントはエラーで終了し、DDL 操作は拒否されます。

  • カラムのデフォルト値を変更する ALTER TABLE ステートメントでは、col_name を使用してカラムを参照する生成されたカラム式の値を変更することもできます。これにより、DEFAULT(col_name) を使用してカラムを参照する生成されたカラム式の値を変更できます。 このため、生成されたカラム式で DEFAULT() が使用されている場合、カラムの定義を変更する ALTER TABLE 操作によってテーブルが再構築されます。


関連キーワード:  ステートメント, TABLE, カラム, CREATE, 生成, DROP, INT, 変更, COLUMN, 操作