Từ MySQL 5.7, bạn có thể định nghĩa Generated Column (Cột sinh ra) - cột giá trị tự động tính toán từ các cột khác. Ví dụ: lưu độ dài chuỗi của cột Title vào cột Number_of_characters bằng CHAR_LENGTH() ngay khi CREATE TABLE.
Tạo bảng với Generated Column
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Title VARCHAR(200),
`Number_of_characters` INT AS (CHAR_LENGTH(Title))
);
AS (CHAR_LENGTH(Title)) định nghĩa cột ảo (VIRTUAL) - tính toán khi đọc, không tốn dung lượng lưu trữ. Thêm STORED sau AS để lưu vật lý (tốn dung lượng, đọc nhanh hơn).
Chèn dữ liệu
mysql> INSERT INTO DemoTable (Title) VALUES
('Introduction To MySQL'),
('Introduction To Java'),
('Introduction To MongoDB');
Kết quả: Cột Number_of_characters tự động được tính
mysql> SELECT * FROM DemoTable;
+----+-------------------------+----------------------+
| Id | Title | Number_of_characters |
+----+-------------------------+----------------------+
| 1 | Introduction To MySQL | 21 |
| 2 | Introduction To Java | 20 |
| 3 | Introduction To MongoDB | 23 |
+----+-------------------------+----------------------+
Lợi ích
- Đảm bảo tính nhất quán: Độ dài luôn khớp với Title.
- Không cần trigger, không cần logic ứng dụng.
- Có thể index trên Generated Column (MySQL 5.7+ STORED, 8.0+ VIRTUAL) để tìm kiếm nhanh theo độ dài.
Các hàm thường dùng trong Generated Column
CHAR_LENGTH(),LENGTH()UPPER(),LOWER(),TRIM()JSON_EXTRACT()(trích xuất từ JSON)- Phép toán:
price * quantity,YEAR(date), v.v.
Lưu ý: Generated Column không thể được chèn/ cập nhật trực tiếp (INSERT/UPDATE sẽ lỗi nếu chỉ định giá trị cho cột này).