原文地址
MySQL的表生成列通常又叫做虚拟列或计算列。这个生成列的值是在列定义时包含了一个计算表达式计算得到的,有两种类型的生成列:
虚拟生成列有时候比存储生成列更有用,因为它不会占用存储空间。
假如有一个应用,需要添加一个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资源下载