仮想列(かそうれつ、: virtual column)は、関係データベースでは、テーブルの一種で、その値は他の列の値や別の決定論的な計算式を用いて自動的に計算される。仮想列はSQL:2003生成列 (: generated column)[1]として定義されており、MariaDBSQL ServerOracleSQLiteFirebird (データベースサーバー)などのデータベース管理システムがCOMPUTED BY構文として実装している。製品によっては計算列 (: computed column)という名前で呼ばれる。

実装 編集

仮想列には次の2つの種類がある。

  • 仮想化列
  • 永続化列

仮想化列の値は、SELECTステートメントによって返される場合など、必要に応じてオンザフライで計算される。永続化列の値は、がテーブルに挿入されたときに計算され、他のすべての値と同じように書き込まれる。他の値が変更されると、変更される可能性がある。仮想化列と永続化列は、それぞれ長所と短所がある。仮想化列はディスク上のスペースを消費しないが、クエリがそれらを参照するたびに計算する必要がある。永続化列はCPU時間を消費しない代わりに、ディスク領域を消費する。DBMSによっては仮想化列と永続化列の選択肢がない場合がある。

IBM DB2 編集

Db2データベースはバージョン8で、生成列という名前で仮想列をサポートする[2]

MariaDB 編集

MariaDBMySQLの分岐である。 バージョン5.2で仮想列が追加された[3]

仮想列の計算に使用できる式には、次の制限がある。

  • 決定論的である必要がある。
  • 定数値を返すことはできない。
  • ユーザー定義関数またはストアドプロシージャは使用できない。
  • 他の仮想列は含められない。
  • サブクエリは利用できない。

永続化列にはインデックスを付けることができ、外部キーの一部にすることができるが、制約の適用に関するいくつかの小さな制限がある。

仮想化列は、これをサポートするストレージエンジンを使うテーブルでのみ使用できる。仮想化列をサポートしているストレージエンジンは次の通りである。

MRG_MyISAMテーブルは、永続化列を含むMyISAMテーブルに基づくことができる。ただし、対応するMRG_MyISAM列は通常の列として定義する必要がある。

構文 編集

CREATETABLEまたはALTERTABLEステートメントを使用して、仮想列を追加できる。仮想列の定義に使用される構文は次の通りである。

<type> [GENERATED ALWAYS] AS  ( <expression> ) [VIRTUAL | PERSISTENT] [UNIQUE] [UNIQUE KEY] [COMMENT <text>]
  • typeは、列のデータ型。
  • expressionは、各行の列の値を返すSQL式。
  • textはオプションの列コメント。

MySQL 編集

MySQLでは5.7から生成列という名前で仮想列のサポートが始まった。以降のバージョンでは、それらの使用に関するさまざまな制限が緩和されている[4]

Oracle 編集

バージョン11g以降、 Oracleは仮想列をサポートする[5]

SQL Server 編集

Microsoft SQL Serverは計算列という名前で仮想列をサポートする[6]

SQL Serverの計算列は、永続化列/仮想化列の両方をサポートする。

Firebird 編集

Firebirdは、Computed Columnsと呼ばれるその前身であるInterBaseが仮想列をサポートしているため、常に仮想列をサポートしてきた[7]

Firebirdは、永続化列ではなく仮想化列をサポートし、サブクエリ、組み込み関数、外部関数、および仮想列式のストアドルーチンの呼び出しを可能にする。

構文 編集

仮想列の作成は、テーブルの作成中に実行できる。既存のテーブルに列を追加する場合、仮想列の定義に使用される構文は次の通りである。

column_name [type] COMPUTED BY (expression)

または

column_name [type] GENERATED ALWAYS AS (expression)

PostgreSQL 編集

バージョン12以降、 PostgreSQLは生成列という名前で永続化列をサポートする[8]

SQLite 編集

バージョン3.31.0(2020-01-22)以降、 SQLiteは生成列という名前で仮想列をサポートする[9]

脚注 編集

 

外部リンク 編集