什麼是 MySQL 生成列,如何在建立表時使用它?
基本上,生成列是一個可以在 CREATE TABLE 或 ALTER TABLE 語句中使用的功能,它是一種儲存資料的方式,而無需實際透過 SQL 中的 INSERT 或 UPDATE 子句傳送資料。此功能已在 MySQL 5.7 中新增。生成列在表域中工作。其語法如下所示:
語法
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
首先,指定列名及其資料型別。
- 然後新增 GENERATED ALWAYS 子句以指示該列是生成列。
- 然後,使用相應的選項(VIRTUAL 或 STORED)指示生成列的型別。預設情況下,如果您沒有顯式指定生成列的型別,MySQL 將使用 VIRTUAL。
之後,在 AS 關鍵字之後的括號內指定表示式。表示式可以包含文字、沒有引數的內建函式、運算子或對同一表中任何列的引用。如果使用函式,它必須是標量且確定性的。
最後,如果儲存了生成列,則可以為其定義唯一約束。
示例
在此示例中,我們正在建立一個名為 employee_data 的表,其中包含員工的詳細資訊以及一個生成的列,如下所示:
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 | +------------+-------------+------+-----+---------+-------------------+ 4 rows in set (0.00 sec) 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 | +----+------------+-----------+----------------+ 3 rows in set (0.00 sec)
廣告