Generated Column เป็นคุณสมบัติของ MySQL 5.7+ ที่กำหนดคอลัมน์ซึ่งค่าถูกคำนวณอัตโนมัติจากนิพจน์ (Expression) ไม่ต้องระบุค่าใน INSERT/UPDATE
รูปแบบไวยากรณ์ (Syntax)
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
องค์ประกอบ:
column_name data_type- ชื่อและชนิดข้อมูลGENERATED ALWAYS- ระบุว่าเป็น Generated Column (Optional)AS (expression)- นิพจน์คำนวณ (อ้างอิงคอลัมน์อื่นในตารางเดียวได้)VIRTUAL | STORED- ประเภท (Default = VIRTUAL)UNIQUE [KEY]- สำหรับ Stored Column เท่านั้น
ตัวอย่างสร้างตาราง employee_data พร้อม Generated Column FULL_NAME
mysql> CREATE TABLE employee_data(
ID INT AUTO_INCREMENT PRIMARY KEY,
First_name VARCHAR(50) NOT NULL,
Last_name VARCHAR(50) NOT NULL,
FULL_NAME VARCHAR(90) GENERATED ALWAYS AS (CONCAT(First_name, ' ', Last_name))
);
Query OK, 0 rows affected (0.55 sec)
mysql> DESCRIBE employee_data;
+------------+-------------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| First_name | varchar(50) | NO | | NULL | |
| Last_name | varchar(50) | NO | | NULL | |
| FULL_NAME | varchar(90) | YES | | NULL | VIRTUAL GENERATED |
+------------+-------------+------+-----+---------+-------------------+
ทดสอบเพิ่มข้อมูล (ไม่ต้องระบุ FULL_NAME)
mysql> INSERT INTO employee_data(first_name, last_name) VALUES('Yashpal', 'Sharma');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, last_name) VALUES('Krishan', 'Kumar');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO employee_data(first_name, last_name) VALUES('Rakesh', 'Arora');
Query OK, 1 row affected (0.08 sec)
mysql> SELECT * FROM employee_data;
+----+------------+-----------+----------------+
| ID | First_name | Last_name | FULL_NAME |
+----+------------+-----------+----------------+
| 1 | Yashpal | Sharma | Yashpal Sharma |
| 2 | Krishan | Kumar | Krishan Kumar |
| 3 | Rakesh | Arora | Rakesh Arora |
+----+------------+-----------+----------------+
ข้อจำกัดของ Expression: ต้องเป็น Scalar, Deterministic, ไม่ใช้ Subquery, ไม่ใช้ฟังก์ชันที่ให้ผลลัพธ์ต่างกันไป (เช่น NOW(), RAND(), UUID())