MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

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

13.1.20.8 CREATE TABLE および生成されるカラム

CREATE TABLE では、生成されるカラムの指定がサポートされています。 生成されたカラムの値は、カラム定義に含まれる式から計算されます。

生成されたカラムは、NDB ストレージエンジンでもサポートされます。

次の単純な例は、sidea カラムおよび sideb カラムに右側の三角形の長さを格納し、sidec のハイフンの長さを計算するテーブルを示しています (もう一方の辺の二乗の合計の平方根):

CREATE TABLE triangle (
  sidea DOUBLE,
  sideb DOUBLE,
  sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

テーブルから選択すると、次の結果になります:

mysql> SELECT * FROM triangle;
+-------+-------+--------------------+
| sidea | sideb | sidec              |
+-------+-------+--------------------+
|     1 |     1 | 1.4142135623730951 |
|     3 |     4 |                  5 |
|     6 |     8 |                 10 |
+-------+-------+--------------------+

triangle テーブルを使用するアプリケーションは、それらを計算する式を指定しなくても、ハイフン値にアクセスできます。

生成されるカラム定義の構文は次のとおりです:

col_name data_type [GENERATED ALWAYS] AS (expr)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT 'string']

AS (expr) は、カラムが生成されることを示し、カラム値の計算に使用される式を定義します。 カラムの生成された性質をより明確にするために、AS の前に GENERATED ALWAYS を付けることができます。 式で許可または禁止されている構造体については、あとで説明します。

VIRTUAL または STORED キーワードは、カラム値の格納方法を示します。これは、カラムの使用に影響します:

どちらのキーワードも指定されていない場合、デフォルトは VIRTUAL です。

テーブル内で VIRTUAL カラムと STORED カラムを混在させることができます。

カラムがインデックス付けされているか、NULL であるか、またはコメントを提供できるかを示す他の属性を指定できます。

生成されるカラム式は、次のルールに従う必要があります。 許可されていない構造が式に含まれている場合は、エラーが発生します。

式が宣言されたカラム型とは異なるデータ型に評価された場合、宣言された型への暗黙的な強制は、通常の MySQL 型変換ルールに従って行われます。 セクション12.3「式評価での型変換」を参照してください。

生成されたカラムが TIMESTAMP データ型を使用している場合、explicit_defaults_for_timestamp の設定は無視されます。 このような場合、この変数を無効にすると、NULLCURRENT_TIMESTAMP に変換されません。 MySQL 8.0.22 以降では、カラムが NOT NULL としても宣言されている場合、NULL を挿入しようとすると ER_BAD_NULL_ERROR で明示的に拒否されます。

注記

式の評価では、評価時に有効な SQL モードが使用されます。 式のいずれかのコンポーネントが SQL モードに依存している場合、すべての使用中に SQL モードが同じでないかぎり、テーブルの使用方法によって結果が異なることがあります。

CREATE TABLE ... LIKE の場合、宛先テーブルには元のテーブルから生成されたカラム情報が保持されます。

CREATE TABLE ... SELECT の場合、宛先テーブルでは、選択元テーブルのカラムが生成されたカラムであるかどうかに関する情報は保持されません。 ステートメントの SELECT 部分では、宛先テーブルの生成されたカラムに値を割り当てることはできません。

生成されたカラムによるパーティション化が許可されます。 テーブルのパーティション化を参照してください。

格納された生成カラムに対する外部キー制約では、CASCADESET NULL または SET DEFAULTON UPDATE 参照アクションとして使用することも、SET NULL または SET DEFAULTON DELETE 参照アクションとして使用することもできません。

格納された生成カラムのベースカラムに対する外部キー制約では、CASCADESET NULL または SET DEFAULTON UPDATE または ON DELETE の参照アクションとして使用できません。

外部キー制約は、仮想生成カラムを参照できません。

トリガーは、NEW.col_name または OLD.col_name を使用して生成されたカラムを参照することはできません。

INSERTREPLACE および UPDATE では、生成されたカラムが明示的に挿入、置換または更新される場合、許可される値は DEFAULT のみです。

ビュー内の生成されたカラムは、割り当て可能であるため、更新可能とみなされます。 ただし、このようなカラムが明示的に更新される場合、許可される値は DEFAULT のみです。

生成されるカラムには、次のようないくつかのユースケースがあります:

例:

テーブル t1first_name カラムと last_name カラムが含まれており、アプリケーションが次のような式を使用してフルネームを頻繁に構成するとします:

SELECT CONCAT(first_name,' ',last_name) AS full_name FROM t1;

式を書き出さないようにするには、t1 でビュー v1 を作成します。これにより、式を使用せずに full_name を直接選択できるため、アプリケーションが簡略化されます:

CREATE VIEW v1 AS
SELECT *, CONCAT(first_name,' ',last_name) AS full_name FROM t1;

SELECT full_name FROM v1;

生成されたカラムを使用すると、ビューを定義せずに、アプリケーションで full_name を直接選択することもできます:

CREATE TABLE t1 (
  first_name VARCHAR(10),
  last_name VARCHAR(10),
  full_name VARCHAR(255) AS (CONCAT(first_name,' ',last_name))
);

SELECT full_name FROM t1;