生成された列のサポートは、2020年1月22日にリリースされたバージョン3.31.0でSQLiteに追加されました。
生成された列と計算された列は同じものです。これらは、値が同じ行の他の列の関数である列です。
SQLiteでは、生成された列はGENERATED ALWAYS
を使用して作成されます テーブルを作成または変更するときの列の制約。
生成される列には2つのタイプがあります。 STORED
およびVIRTUAL
。 VIRTUAL
のみ テーブルを変更するときに列を追加できます。テーブルを作成するときに両方のタイプを追加できます。
例
実例を示します。
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
次のエラーが発生した場合:
Error: near "AS": syntax error
たぶん、SQLiteの新しいバージョンにアップグレードする必要があります。生成された列はSQLite3.31.0でのみ導入されました。
次に、データを挿入して選択します。
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
これは単純な例であり、組み込み関数を使用する式など、より複雑な式を使用することもできます。
仮想vs保存
デフォルトでは、計算列はVIRTUAL
として作成されます 桁。
STORED
を作成するオプションもあります 列。
VIRTUAL
の値 列は読み取り時に計算されますが、STORED
の値は 列は、行が書き込まれるときに計算されます。
VIRTUAL
を明示的に使用できます またはSTORED
列の定義で、どちらにするかを示します。これを省略すると、VIRTUAL
になります。 。
STORED
を使用するように前の例を変更する方法は次のとおりです。 列。
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
STORED
であるかどうかに関係なく 列またはVIRTUAL
、データの入力と選択はまったく同じです。
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
生成された列のデータを更新する
計算列のデータを直接更新することはできません。つまり、計算列自体に直接書き込むことはできません。
データを更新するには、計算列の式で使用される基になる列のデータを更新する必要があります。
前の例で使用したデータを更新する例を次に示します。
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に減らしました。これにより、在庫のハンマーの合計値と生成された列の値( TotalValue )が減少しました。 )99.99から49.95に減少しました。