跳到主要内容

MySQL 生成列

什么是MySQL生成列?

MySQL生成列(Generated Columns)是MySQL 5.7及以上版本引入的一项高级特性。生成列的值是通过表达式计算得出的,而不是通过手动插入或更新数据。生成列可以分为两种类型:

  1. 虚拟生成列(VIRTUAL):列的值在查询时动态计算,不占用存储空间。
  2. 存储生成列(STORED):列的值在插入或更新时计算并存储,占用存储空间。

生成列的主要用途是简化查询逻辑、提高查询性能以及确保数据一致性。


生成列的语法

生成列的定义语法如下:

sql
column_name data_type [GENERATED ALWAYS] AS (expression)
[VIRTUAL | STORED] [NOT NULL | NULL]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
  • column_name:生成列的名称。
  • data_type:生成列的数据类型。
  • expression:用于计算列值的表达式。
  • VIRTUALSTORED:指定生成列的类型(默认为 VIRTUAL)。

生成列的示例

示例1:虚拟生成列

假设我们有一个 products 表,其中包含 pricequantity 两列。我们可以创建一个虚拟生成列 total_price,用于计算每个产品的总价。

sql
CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10, 2),
quantity INT,
total_price DECIMAL(10, 2) AS (price * quantity) VIRTUAL
);

插入数据并查询:

sql
INSERT INTO products (id, price, quantity) VALUES (1, 10.50, 5);
SELECT * FROM products;

输出:

idpricequantitytotal_price
110.50552.50
备注

虚拟生成列的值在查询时动态计算,因此不会占用额外的存储空间。


示例2:存储生成列

如果我们希望将 total_price 的值存储起来以提高查询性能,可以使用存储生成列。

sql
CREATE TABLE products_stored (
id INT PRIMARY KEY,
price DECIMAL(10, 2),
quantity INT,
total_price DECIMAL(10, 2) AS (price * quantity) STORED
);

插入数据并查询:

sql
INSERT INTO products_stored (id, price, quantity) VALUES (1, 10.50, 5);
SELECT * FROM products_stored;

输出:

idpricequantitytotal_price
110.50552.50
警告

存储生成列的值在插入或更新时计算并存储,因此会占用额外的存储空间。


生成列的实际应用场景

场景1:计算字段

生成列非常适合用于计算字段,例如计算总价、折扣价或税费等。通过生成列,可以避免在每次查询时重复编写复杂的计算逻辑。

场景2:数据一致性

生成列可以确保数据的计算逻辑一致。例如,在 products 表中,total_price 的值始终是 pricequantity 的乘积,避免了手动更新时可能出现的错误。

场景3:索引优化

存储生成列可以用于创建索引,从而提高查询性能。例如,如果经常需要根据 total_price 进行查询,可以在存储生成列上创建索引。

sql
CREATE INDEX idx_total_price ON products_stored(total_price);

总结

MySQL生成列是一项强大的功能,能够简化查询逻辑、提高性能并确保数据一致性。通过虚拟生成列和存储生成列,开发者可以根据实际需求选择适合的生成列类型。

提示

在实际开发中,建议优先使用虚拟生成列,除非有明确的性能需求或需要创建索引。


附加资源与练习

练习1

创建一个 employees 表,包含 salarybonus 两列,并添加一个虚拟生成列 total_income,用于计算总收入。

练习2

employees 表中添加一个存储生成列 tax,用于计算税费(假设税率为20%),并在该列上创建索引。

进一步学习