Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL Generated Column คืออะไร และการใช้งานตอน CREATE TABLE

Generated Column เป็นคุณสมบัติของ MySQL 5.7+ ที่กำหนดคอลัมน์ซึ่งค่าถูกคำนวณอัตโนมัติจากนิพจน์ (Expression) ไม่ต้องระบุค่าใน INSERT/UPDATE

รูปแบบไวยากรณ์ (Syntax)

column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]

องค์ประกอบ:

  1. column_name data_type - ชื่อและชนิดข้อมูล
  2. GENERATED ALWAYS - ระบุว่าเป็น Generated Column (Optional)
  3. AS (expression) - นิพจน์คำนวณ (อ้างอิงคอลัมน์อื่นในตารางเดียวได้)
  4. VIRTUAL | STORED - ประเภท (Default = VIRTUAL)
  5. 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())