Hỗ trợ cột đã tạo đã được thêm vào SQLite trong phiên bản 3.31.0, được phát hành vào ngày 22 tháng 1 năm 2020.
Cột được tạo và cột được tính giống nhau. Chúng là các cột có giá trị là một hàm của các cột khác trong cùng một hàng.
Trong SQLite, các cột đã tạo được tạo bằng cách sử dụng GENERATED ALWAYS
ràng buộc cột khi tạo hoặc thay đổi bảng.
Có hai loại cột được tạo; STORED
và VIRTUAL
. Chỉ VIRTUAL
cột có thể được thêm vào khi thay đổi bảng. Cả hai loại đều có thể được thêm vào khi tạo bảng.
Ví dụ
Đây là một ví dụ để chứng minh.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Nếu bạn gặp lỗi sau:
Error: near "AS": syntax error
Rất có thể, bạn cần nâng cấp lên phiên bản SQLite mới hơn. Các cột đã tạo chỉ được giới thiệu trong SQLite 3.31.0.
Bây giờ, hãy chèn dữ liệu và chọn nó.
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;
Kết quả:
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
Đây là một ví dụ đơn giản và bạn chắc chắn có thể sử dụng các biểu thức phức tạp hơn, chẳng hạn như các biểu thức sử dụng các hàm tích hợp sẵn.
Ảo so với Đã lưu trữ
Theo mặc định, cột được tính toán được tạo dưới dạng VIRTUAL
cột.
Bạn cũng có tùy chọn tạo STORED
cột.
Giá trị của VIRTUAL
cột được tính khi đọc, trong khi giá trị của một STORED
cột được tính khi hàng được viết.
Bạn có thể sử dụng rõ ràng VIRTUAL
hoặc STORED
trong định nghĩa cột của bạn để cho biết nó phải là cột nào. Nếu bạn bỏ qua điều này, thì nó sẽ là VIRTUAL
.
Dưới đây là cách chúng tôi có thể thay đổi ví dụ trước để sử dụng STORED
cột.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Bất kể đó có phải là STORED
hay không cột hoặc VIRTUAL
, việc nhập và chọn dữ liệu hoàn toàn giống nhau.
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;
Kết quả:
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
Cập nhật dữ liệu trong một cột đã tạo
Bạn không thể cập nhật dữ liệu trực tiếp trong một cột được tính toán. Có nghĩa là, bạn không thể ghi trực tiếp vào chính cột được tính toán.
Để cập nhật dữ liệu của nó, bạn cần cập nhật dữ liệu trong các cột bên dưới được sử dụng trong biểu thức của cột được tính toán.
Dưới đây là ví dụ về cập nhật dữ liệu được sử dụng trong các ví dụ trước.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Kết quả:
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
Trong trường hợp này, tôi đã giảm số lượng búa có sẵn xuống còn 5. Điều này đến lượt nó làm giảm tổng giá trị của búa trong kho và giá trị trong cột được tạo ( TotalValue ) giảm từ 99,99 xuống 49,95.