生成されるカラムに対して許可される ALTER TABLE
操作は、ADD
、MODIFY
および 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 COLUMN
、CHANGE COLUMN
およびMODIFY COLUMN
操作でのみ許可されます。 それ以外の場合は、ER_WRONG_USAGE
エラーが発生します。 式の評価によって切捨てが発生した場合、または関数への入力が正しくない場合、
ALTER TABLE
ステートメントはエラーで終了し、DDL 操作は拒否されます。カラムのデフォルト値を変更する
ALTER TABLE
ステートメントでは、col_name
を使用してカラムを参照する生成されたカラム式の値を変更することもできます。これにより、DEFAULT(
を使用してカラムを参照する生成されたカラム式の値を変更できます。 このため、生成されたカラム式でcol_name
)DEFAULT()
が使用されている場合、カラムの定義を変更するALTER TABLE
操作によってテーブルが再構築されます。