官网原文:https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html
注:以下是我参考官网文档和结合自己的理解写的,因为英文水平有限,不排除有错误,欢迎纠错。
一、说明
Generated Column是MySQL 5.7引入的新特性,所谓Cenerated Column,就是数据库中这一列由其他列计算而得。在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column(虚拟生成的列)和Stored Generated Column(存储生成的列),二者含义如下:
- 1、Virtual Generated Column(虚拟生成的列):不存储该列值,即并不会将这一列数据持久化到磁盘上,而是当读取该行时,触发触发器对该列进行计算显示。InnoDB支持Virtual Generated Column,具体参考“https://dev.mysql.com/doc/refman/5.7/en/create-table-secondary-indexes.html”
- 2、Stored Generated Column(存储生成的列): 存储该列值,即该列值在插入或更新行时进行计算和存储。所以相对于Virtual Column列需要更多的磁盘空间,与Virtual Column相比并没有优势。因此,MySQL 5.7中,不指定Generated Column的类型,默认是Virtual Column
- 在表中允许Virtual Column和Stored Column的混合使用
- 提高效率:由于mysql在普通索引上加函数会造成索引失效,造成查询性能下降,Generated Column(函数索引)刚好可以解决这个问题,可以在Generated Column加上索引来提高效率
二、创建规则
1 col_name data_type [GENERATED ALWAYS] AS (expression) 2 [VIRTUAL | STORED] [NOT NULL | NULL] 3 [UNIQUE [KEY]] [[PRIMARY] KEY] 4 [COMMENT ‘string‘]
三、使用
针对Generated Column使用,参考官网案例来进行说明:
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);