mysql从5.7开始支持Generated Column操作,可以看做继承于目标列,但是可以使用函数进行转换。
Generated Column有两种类型:stored和virtual。
stored即存储实际数据的,而virtual则是在任何BEFORE
触发器之后立即读取行时计算列值 ,不占用存储空间。
示例:
CREATE TABLE triangle (
sidea DOUBLE,
sideb DOUBLE,
sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);
INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
sidec 即是sidea 和 sideb 的Generated Column,sidec 存储的值为SQRT(sidea * sidea + sideb * sideb)
mysql> SELECT * FROM triangle;
+-------+-------+--------------------+
| sidea | sideb | sidec |
+-------+-------+--------------------+
| 1 |1 | 1.4142135623730951 |
|3 | 4 | 5 |
|6 |8 | 10 |
+-------+-------+--------------------+
语法格式:
ALTER TABLE TB_NAME MODIFY col_name data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]
VIRTUAL 于 STORED类型之间不能直接转换
但是STORED可以和普通列进行转换
限制:
-
允许使用文字,确定性内置函数和运算符。
-
不允许存储函数和用户定义的函数。
-
不允许存储过程和函数参数。
-
不允许使用变量(系统变量,用户定义的变量和存储的程序局部变量)。
-
不允许子查询。
-
生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。生成的列定义可以引用表中的任何基本(非生成)列,无论其定义是早期还是稍后发生。
-
该
AUTO_INCREMENT
属性不能用于生成的列定义。 -
一个
AUTO_INCREMENT
列不能用作在生成的列定义的基柱。 -
从MySQL 5.7.10开始,如果表达式求值导致截断或向函数提供不正确的输入,则
CREATE TABLE
语句将终止并显示错误,并拒绝DDL操作。 -
对于
CREATE TABLE ... SELECT
,目标表不保留有关selected-from表中的列是否为生成列的信息。SELECT
语句的 一部分无法为目标表中的生成列分配值。 -
允许按生成的列进行分区
-
在存储生成列外键约束不能使用
CASCADE
,SET NULL
或SET DEFAULT
作为ON UPDATE
参照动作,也不能使用SET NULL
或SET DEFAULT
作为ON DELETE
参照动作。 -
在存储生成列的基本列外键约束不能使用
CASCADE
,SET NULL
或SET DEFAULT
作为ON UPDATE
或ON DELETE
引用操作。外键约束不能引用虚拟生成的列。
-
InnoDB
外键和生成列的限制,请参见 第14.6.1.5节“InnoDB和FOREIGN KEY约束”。 -
NEW.
col_name
OLD.
col_name
-
对于
INSERT
,,REPLACE
和UPDATE
,如果生成的列明确插入,替换或更新,则唯一允许的值为DEFAULT
。 -
视图中生成的列被视为可更新,因为可以为其分配。但是,如果明确更新此类列,则唯一允许的值为
DEFAULT
。