MySQL表生成列(Generated Columns)的使用说明

原文地址

MySQL的表生成列通常又叫做虚拟列计算列。这个生成列的值是在列定义时包含了一个计算表达式计算得到的,有两种类型的生成列:

  • Virtual(虚拟):这个类型的列会在读取表记录时自动计算此列的结果并返回。
  • Stored(存储):这个类型的列会在表中插入一条数据时自动计算对应的值,并插入到这个列中,那么这个列会作为一个常规列存在表中。

虚拟生成列有时候比存储生成列更有用,因为它不会占用存储空间。

假如有一个应用,需要添加一个full_name列,值是first_name和last_name的组合即concat(`first_name`,' ',`last_name`),在读取数据时,你可以使用这个虚拟列来代替表达式查询语句,它会自动动态计算full_name列的值。

mysql> CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
`full_name` VARCHAR(30) AS (CONCAT(first_name,'
',last_name)),
PRIMARY KEY (`emp_no`),
KEY `name` (`first_name`,`last_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

注意上面的`full_name`这个虚拟列在创建表时的定义方式。语句中的KEY表式添加一个名为name的复合索引。

在插入或修改数据时是不需要插入这个虚拟列full_name的数据的。如果非要写,那值黙认写为DEFAULT,写在其它值会报错:ERROR 3105 (HY000)。

mysql> INSERT INTO employees (emp_no, birth_date,
first_name, last_name, gender, hire_date) VALUES
(123456, '1987-10-02', 'ABC' , 'XYZ', 'F', '2008-07-28');
mysql> INSERT INTO employees (emp_no, birth_date,
first_name, last_name, gender, hire_date, full_name)
VALUES (123456, '1987-10-02', 'ABC' , 'XYZ', 'F',
'2008-07-28', DEFAULT);

注意这里的DEFAULT不能为其它值。

你可以直接从employees表中查询full_name列的值:

mysql> SELECT * FROM employees WHERE emp_no=123456;
+--------+------------+------------+-----------+-----
---+------------+-----------+
| emp_no | birth_date | first_name | last_name |
gender | hire_date | full_name |
+--------+------------+------------+-----------+-----
---+------------+-----------+
| 123456 | 1987-10-02 | ABC | XYZ | F
| 2017-11-23 | ABC XYZ |
+--------+------------+------------+-----------+-----
---+------------+-----------+
1 row in set (0.00 sec)

如果你已经创建了一张表,再添加一个虚拟列时,怎么做呢?直接运用常规的SQL修改表添加列,如下所示:

ALTER TABLE employees ADD hire_date_year YEAR as (YEAR(hire_date)) VIRTUAL;

这样就添加了一个自动计算的虚拟生成列了哦~

Java电子书免费下载

MySQL相关资料

更多IT资源下载

猜你喜欢

转载自blog.csdn.net/zxstrive/article/details/87854732
今日推荐