Dukungan kolom yang dihasilkan telah ditambahkan ke SQLite dalam versi 3.31.0, yang dirilis pada 22 Januari 2020.
Kolom yang dihasilkan dan kolom yang dihitung adalah hal yang sama. Mereka adalah kolom yang nilainya merupakan fungsi dari kolom lain pada baris yang sama.
Di SQLite, kolom yang dihasilkan dibuat menggunakan GENERATED ALWAYS
batasan kolom saat membuat atau mengubah tabel.
Ada dua jenis kolom yang dihasilkan; STORED
dan VIRTUAL
. Hanya VIRTUAL
kolom dapat ditambahkan saat mengubah tabel. Kedua tipe tersebut dapat ditambahkan saat membuat tabel.
Contoh
Berikut ini contoh untuk didemonstrasikan.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Jika Anda mendapatkan kesalahan berikut:
Error: near "AS": syntax error
Kemungkinannya adalah, Anda perlu memutakhirkan ke versi SQLite yang lebih baru. Kolom yang dihasilkan hanya diperkenalkan di SQLite 3.31.0.
Sekarang mari kita masukkan data dan pilih.
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;
Hasil:
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
Ini adalah contoh sederhana dan Anda pasti dapat menggunakan ekspresi yang lebih kompleks, misalnya ekspresi yang menggunakan fungsi bawaan.
Virtual vs Tersimpan
Secara default, kolom yang dihitung dibuat sebagai VIRTUAL
kolom.
Anda juga memiliki opsi untuk membuat STORED
kolom.
Nilai dari VIRTUAL
kolom dihitung saat dibaca, sedangkan nilai STORED
kolom dihitung saat baris ditulis.
Anda dapat secara eksplisit menggunakan VIRTUAL
atau STORED
dalam definisi kolom Anda untuk menunjukkan yang mana yang seharusnya. Jika Anda menghilangkan ini, maka itu akan menjadi VIRTUAL
.
Inilah cara kita dapat mengubah contoh sebelumnya untuk menggunakan STORED
kolom.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Terlepas dari apakah itu STORED
kolom atau VIRTUAL
, memasukkan dan memilih data sama persis.
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;
Hasil:
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
Memperbarui Data di Kolom yang Dihasilkan
Anda tidak dapat memperbarui data secara langsung di kolom yang dihitung. Artinya, Anda tidak dapat menulis langsung ke kolom yang dihitung itu sendiri.
Untuk memperbarui datanya, Anda perlu memperbarui data di kolom dasar yang digunakan dalam ekspresi kolom yang dihitung.
Berikut adalah contoh memperbarui data yang digunakan pada contoh sebelumnya.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Hasil:
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
Dalam hal ini saya mengurangi jumlah palu yang tersedia menjadi 5. Hal ini pada gilirannya mengurangi nilai total palu dalam stok dan nilai di kolom yang dihasilkan (TotalValue ) dikurangi dari 99,99 menjadi 49,95.