概况
生成列(generated column)是MySQL 5.7 引入的新功能, 此列中的数据是基于预定义的表达式或从其他列计算的。
类型
生成列分为两种类型,默认virtual。
virtual
(虚拟):当从表中读取记录时,将动态计算该列,不占用任何存储空间。stored
(存储):当向表中写入新或更新记录时,将计算该列并将其存储为常规列,占存储空间。
从两种类型的存储和计算方式来看,virtual生成列更加有优势,因为它不需要额外的存储空间以及存储时不需要计算,所以一般情况下,都使用virtual生成列,这也是MySQL默认的方式。
语法
column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]
首先,指定列名及其数据类型。
接下来,添加 GENERATED ALWAYS
子句以指示列是生成的列。
然后,通过使用相应的选项来指示生成列的类型: VIRTUAL
或 STORED
。 默认情况下,如果未明确指定生成列的类型,MySQL将使用 VIRTUAL
。
之后,在AS关键字后面的大括号内指定表达式。 该表达式可以包含文字,内置函数,无参数,操作符或对同一表中任何列的引用。 如果你使用一个函数,它必须是标量和确定性的。
最后,如果生成的列被存储,可以为它定义一个唯一约束。
实例
背景
数据库的有个文件信息表,文件类里面存了一个json类型的字段 ,这个字段的属性名称不是固定的,它是根据每条数据的类型来决定的。
CREATE TABLE file_info (
id INT AUTO_INCREMENT PRIMARY KEY,
file_name VARCHAR(128) NOT NULL,
type_name VARCHAR(128) NOT NULL,
type_prop JSON,
owner_name VARCHAR(128) NOT NULL
);
需求
现在前台查询需要一个功能:通过一个输入框的输入值,模糊匹配所有相关字段值(包括json类型字段的属性的值),查询出所有符合条件的数据。
分析
如果是通过普通方法,实现的SQL语句需要拼接多个字段进行 like 模糊查询,这
JSON_EXTRACT(type_prop,’$.*’)
如果是用生成列的话,查询的时候只需要对一个字段进行模糊查询