创建SQL表时如何将两列计算结果定义为计算列存储?
SQL建表阶段定义持久化计算列的实现方案
你需求的功能完全可以在建表阶段实现,这类自动根据其他列计算结果、可以选择持久化存储的列在SQL标准中称为生成列,多数主流数据库都支持和MS Access计算字段等效的持久化配置,计算结果会直接保存在表中,无需每次查询时动态计算。
不同数据库的具体语法略有区别,以下是常见数据库的实现示例:
- MySQL 8.0+/MariaDB
使用STORED关键字指定生成列持久化存储,建表语句如下:
CREATE TABLE your_table ( ID INT, Number1 INT, Number2 INT, Total INT GENERATED ALWAYS AS (Number1 + Number2) STORED );
如果不加STORED默认是VIRTUAL模式,仅在查询时计算,不会占用存储空间。
- SQL Server
使用PERSISTED关键字标记持久化计算列,示例:
CREATE TABLE your_table ( ID INT, Number1 INT, Number2 INT, Total AS Number1 + Number2 PERSISTED );
- Oracle 11g+/PostgreSQL 12+
二者语法和MySQL一致,使用STORED参数:
CREATE TABLE your_table ( ID INT, Number1 INT, Number2 INT, Total INT GENERATED ALWAYS AS (Number1 + Number2) STORED );
注意事项
- 持久化计算列的表达式不能使用非确定性函数(如
RAND()、NOW()等),否则无法完成持久化配置,因为每次计算结果不固定。 - 当
Number1或Number2的值发生更新时,持久化计算列会自动同步更新,不需要额外手动维护。 - 如果你使用的数据库版本过旧不支持原生生成列,可以通过新增常规列+触发器的方式模拟实现,只是维护成本比原生特性更高。
内容的提问来源于stack exchange,提问作者Mohamed-Atef
相关产品推荐
相关产品推荐

