リレーショナルデータベースでは、仮想列は、他の列の値または別の決定論的な式を使用して値が自動的に計算されるテーブル列です。仮想列は、 SQL:2003で生成列として定義されており、[ 1 ] MariaDB、SQL Server、Oracle、PostgreSQL、SQLite、Firebird (データベースサーバー) (COMPUTED BY 構文)などの一部のDBMSでのみ実装されています。
列には2種類あります。
仮想列の値は、必要に応じて、たとえば SELECT 文によって返されるときに、その場で計算されます。永続列の値は、テーブルに行が挿入されたときに計算され、他のすべての値と同様に書き込まれます。他の値が変更されると、永続列の値も変更される可能性があります。仮想列と永続列にはそれぞれ長所と短所があります。仮想列はディスク上の領域を消費しませんが、クエリが参照するたびに計算する必要があります。永続列は CPU 時間を消費しませんが、ディスク領域を消費します。ただし、一部の DBMS は 1 つの列タイプのみをサポートしている(またはどちらもサポートしていない)ため、選択できない場合もあります。
IBM Db2 は、バージョン 8 の仮想列を生成列としてサポートしています。[ 2 ]
MariaDBはMySQLのフォークです。仮想カラムは5.2ツリーで追加されました。[ 3 ]
仮想列を計算するために使用できる式には、以下の制限があります。
永続列はインデックスを作成でき、外部キーの一部にすることもできますが、制約の適用に関して若干の制限があります。
仮想列は、仮想列をサポートするストレージエンジンを使用するテーブルでのみ使用できます。仮想列をサポートするストレージエンジンは以下のとおりです。
MRG_MyISAM テーブルは、永続列を含む MyISAM テーブルを基に作成できますが、対応する MRG_MyISAM 列は通常の列として定義する必要があります。
CREATE TABLE または ALTER TABLE ステートメントを使用して仮想列を追加できます。仮想列を定義するために使用される構文は次のとおりです。
<タイプ> [常に生成] AS ( <式> ) [仮想|永続] [一意] [一意キー] [コメント<テキスト> ]MySQLでは生成列として知られる仮想列のサポートは、MySQL 5.7で利用可能になり始めました。その後のバージョンでは、その使用に関するさまざまな制限が緩和されています。 [ 4 ]
Microsoft SQL Server は仮想列をサポートしていますが、それらは計算列と呼ばれます。[ 6 ]
SQL Serverは、永続化された計算列と永続化されていない計算列の両方をサポートしています。
Firebirdは、前身のInterBaseがサポートしていた仮想列(計算列と呼ばれる)を常にサポートしてきました。[ 7 ]
Firebirdは、永続的な列ではなく仮想列をサポートしており、仮想列式内でサブクエリ、組み込み関数、外部関数、およびストアドルーチンを呼び出すことができます。
仮想列の作成は、テーブルの作成時、または既存のテーブルに列を追加する際に行うことができます。仮想列を定義するために使用する構文は次のとおりです。
列名[型]計算式(式)または業界標準
column_name [ type ] GENERATED ALWAYS AS ( expression )バージョン12以降、PostgreSQLは生成列と呼ばれる仮想列をサポートしています。[ 8 ]
バージョン3.31.0(2020年1月22日)以降、SQLiteは生成列として知られる仮想列をサポートしています。[ 9 ]