一部のデータベース管理システム(DBMS)には、生成された列と呼ばれる機能が含まれています。
「計算列」とも呼ばれる生成列は、生成列の値が他の列の値を計算する式から派生することを除いて、通常の列と似ています。
つまり、生成された列の値は他の列から計算されます。
例
生成された列がどのように機能するかを示す基本的な例を次に示します。
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
この例はSQLiteで作成され、SQLite構文を使用して生成された列を作成します。この構文では、GENERATED ALWAYS
を使用します 列制約。
GENERATED ALWAYS
一部はSQLiteではオプションなので、AS
を使用できます。 。
実際、GENERATED ALWAYS
一部はMySQLでもオプションであり、TSQL(SQL ServerのSQL拡張機能)でも定義されていないため、AS
必要なのはキーワードだけです(実際の式も一緒に)。
式は、列が保持する実際の値を決定するものです。私の例では、(Qty * Price)
を読み取る部分 その値を決定する式です。
この場合、それは単に数量(各製品の数)に各製品の価格を掛けたものです。
したがって、この生成された列には、在庫内の各株式の合計値が含まれます。
データを挿入して選択すると、生成された列の計算値を確認できます。
INSERT INTO Products VALUES
(1, 'Hammer', 10, 9.99),
(2, 'Saw', 5, 11.34),
(3, 'Wrench', 7, 37.00),
(4, 'Chisel', 9, 23.00),
(5, 'Bandage', 70, 120.00);
SELECT * FROM Products;
結果:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 10 9.99 99.9 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
最初の行を見ると、それぞれ9.99の価格で10個のハンマーがあることがわかります。生成された列はこれら2つの値を乗算し、最終的に99.9になります。
ハンマーの数を減らすと、生成された列は異なる値を生成します。
これが例です。
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
結果:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 5 9.99 49.95 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
この場合、ハンマーの数を5に減らしたため、生成された列は49.95の値を計算しました。
生成された列のタイプ
生成される列には2つのタイプがあります。保存され、仮想。
一部のDBMSは、わずかに異なる用語を使用する場合があります。たとえば、SQLServerは「保存」ではなく「永続的」という用語を使用します。いずれにせよ、それは同じことを指します。
-
VIRTUAL
:列の値は保存されませんが、行が読み取られるときに評価されます。 STORED
:行が挿入または更新されるときに、列の値が評価および保存されます。
STORED
したがって、列にはストレージスペースが必要ですが、VIRTUAL
列はそうではありません。
ただし、これはVIRTUAL
も意味します 列は、読み取られるときに、より多くのCPUサイクルを使用します。
生成された列の利点
生成された列は、クエリを作成する時間を節約し、エラーを減らし、パフォーマンスを向上させることができます。
生成された列は、クエリを単純化および統合する方法として使用できます。複雑な条件は、生成された列として定義し、テーブルの複数のクエリから参照できます。これにより、すべてがまったく同じ条件を使用するようになります。
保存された生成された列は、その場で計算するのにコストがかかる複雑な条件のマテリアライズドキャッシュとして使用できます。
生成される列の制限
生成された列には通常の列と比較して制限がありますが、制限の範囲はDBMSによって決定される場合があります。
たとえば、生成された列は通常、同じ行内の列からのみ値を計算できます。ただし、この制限は、計算列の式の一部としてユーザー定義関数を使用することで(少なくともSQL Serverでは)克服できます。
さまざまなDBMSで生成された列の実装の詳細については、以下のリンクを参照してください。
公式ドキュメント
生成された列の実装の制限を含む、いくつかの一般的なDBMSのドキュメントは次のとおりです。
- SQLServerで計算された列
- PostgreSQL(バージョン12)で生成された列
- MySQL(バージョン8.0)で生成された列
- SQLiteで生成された列