概况

生成列(generated column)是MySQL 5.7 引入的新功能, 此列中的数据是基于预定义的表达式或从其他列计算的。

类型

生成列分为两种类型,默认virtual。

  • virtual (虚拟):当从表中读取记录时,将动态计算该列,不占用任何存储空间。
  • stored (存储):当向表中写入新或更新记录时,将计算该列并将其存储为常规列,占存储空间。

从两种类型的存储和计算方式来看,virtual生成列更加有优势,因为它不需要额外的存储空间以及存储时不需要计算,所以一般情况下,都使用virtual生成列,这也是MySQL默认的方式。

语法

  1. column_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [UNIQUE [KEY]]

首先,指定列名及其数据类型。
接下来,添加 GENERATED ALWAYS 子句以指示列是生成的列。
然后,通过使用相应的选项来指示生成列的类型: VIRTUALSTORED 。 默认情况下,如果未明确指定生成列的类型,MySQL将使用 VIRTUAL
之后,在AS关键字后面的大括号内指定表达式。 该表达式可以包含文字,内置函数,无参数,操作符或对同一表中任何列的引用。 如果你使用一个函数,它必须是标量和确定性的。
最后,如果生成的列被存储,可以为它定义一个唯一约束。

实例

背景

数据库的有个文件信息表,文件类里面存了一个json类型的字段 ,这个字段的属性名称不是固定的,它是根据每条数据的类型来决定的。

  1. CREATE TABLE file_info (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. file_name VARCHAR(128) NOT NULL,
  4. type_name VARCHAR(128) NOT NULL,
  5. type_prop JSON,
  6. owner_name VARCHAR(128) NOT NULL
  7. );

需求

现在前台查询需要一个功能:通过一个输入框的输入值,模糊匹配所有相关字段值(包括json类型字段的属性的值),查询出所有符合条件的数据。

分析

如果是通过普通方法,实现的SQL语句需要拼接多个字段进行 like 模糊查询,这

JSON_EXTRACT(type_prop,’$.*’)

如果是用生成列的话,查询的时候只需要对一个字段进行模糊查询

参考