首页/数据/SQL 速查/生成列(虚拟与存储)
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

生成列(虚拟与存储)

由其他列计算得出:虚拟列即时计算不占存储,存储列落盘、可建索引;常用于把表达式固化成列。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
ALTER TABLE orders
  ADD COLUMN total_with_tax DECIMAL(12,2)
  GENERATED ALWAYS AS (total * 1.13) STORED;

-- 虚拟列(默认 VIRTUAL)可加二级索引
ALTER TABLE orders
  ADD COLUMN order_year INT GENERATED ALWAYS AS (YEAR(created_at)) VIRTUAL,
  ADD INDEX idx_year (order_year);

PostgreSQL

PostgreSQL
ALTER TABLE orders
  ADD COLUMN total_with_tax numeric(12,2)
  GENERATED ALWAYS AS (total * 1.13) STORED;
-- PG 目前仅支持 STORED 形式
MySQLVIRTUAL 不落盘、查询时计算;STORED 落盘、可索引
PostgreSQL仅 STORED;表达式需不可变
用途把表达式固化成列,配合索引服务固定查询模式

易错点

  • 表达式变更后旧值不自动重算:STORED 列需要重建或批量更新才能反映新公式
  • 试图 INSERT 生成列:直接报错,只能写入被依赖的源列

数据来源与参考

  • MySQL 8.0 Reference Manual · Generated Columns
  • PostgreSQL Documentation · Generated Columns
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌