在 MySQL 中,生成列(Generated Column)是一种特殊的列类型,它的值是根据其他列的值或表达式计算得到的。生成列可以分为两种类型:存储生成列(Stored Generated Column)和虚拟生成列(Virtual Generated Column)。
一、特点和使用方法:
1. 存储生成列:
- 特点:
实际存储在表中的值是根据指定的表达式计算得到的。这会增加数据插入和更新的时间成本,但在查询时可以直接使用该列的值,提高查询性能。
- 使用方法:
CREATE TABLE your_table (
id INT PRIMARY KEY,
column1 INT,
column2 INT,
generated_column1 INT GENERATED ALWAYS AS (column1 + column2) STORED
);
- 在上述示例中,'generated_column1' 是一个存储生成列,其值是 'column1' 和 'column2' 的和。
2. 虚拟生成列:
- 特点:
值是在查询时根据表达式动态计算的,不会实际存储在表中。这可以节省存储空间,但在查询时需要额外的计算成本。
- 使用方法:
CREATE TABLE your_table (
id INT PRIMARY KEY,
column1 INT,
column2 INT,
generated_column2 INT GENERATED ALWAYS AS (column1 * column2) VIRTUAL
);
- 在上述示例中,'generated_column2' 是一个虚拟生成列,其值是 'column1' 和 'column2' 的乘积。
二、与其他设计优化的比较:
1. 与普通列相比,生成列可以根据其他列的值自动计算,减少了数据冗余和数据不一致的风险。
2. 与索引相比,生成列可以根据复杂的表达式计算值,而索引通常只能基于单个列或几个列的简单组合。
3. 与视图相比,生成列的值是实际存储在表中的,查询时不需要额外的连接操作,性能可能更好。
三、高级应用:
1. 可以用于数据验证和约束,例如可以创建一个生成列来检查某个值是否在特定范围内。
2. 可以用于提高查询性能,特别是在需要频繁使用某个表达式计算结果的情况下。
以下是一个完整的示例,展示了如何创建和使用生成列:
-- 创建表,包含存储生成列和虚拟生成列
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
price DECIMAL(10, 2),
quantity INT,
total_price DECIMAL(10, 2) GENERATED ALWAYS AS (price * quantity) STORED,
discount_price DECIMAL(10, 2) GENERATED ALWAYS AS (price * 0.9) VIRTUAL
);
-- 插入数据
INSERT INTO products (price, quantity)
VALUES (10.00, 5), (20.00, 3), (30.00, 2);
-- 查询数据,包括生成列的值
SELECT id, price, quantity, total_price, discount_price
FROM products;
在上述示例中,我们创建了一个名为 'products' 的表,其中包含了价格('price')、数量('quantity')、总价('total_price',存储生成列)和折扣价('discount_price',虚拟生成列)。然后,我们插入了一些数据,并查询了所有列的值,包括生成列的值。
(文章为作者在学习MySQL过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)