赞
踩
MySQL的Generated Column又称为虚拟列或计算列。Generated Column列的值是在列定义时包含了一个计算表达式计算得到的。
定义Generated column列的语法如下:
列名 类型
[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]
[NOT NULL | NULL]
[UNIQUE [KEY]]
[[PRIMARY] KEY]
[COMMENT 'string']
说明:
(1)AS(expr)用于生成计算列值的表达式。
(2)VIRTUAL或STORED关键字表示是否存储计算列的值:
VIRTUAL:列值不存储,虚拟列不占用存储空间,默认设置为VIRTUAL。
STORED:在添加或更新行时计算并存储列值。存储列需要存储空间,并且可以创建索引。
Generated column表达式必须遵循以下规则。如果表达式包含不允许的定义方式,则会发生错误。
(1)允许使用文本、内置函数和运算符,但不能使用返回值不确定的函数,比如NOW()。
(2)不允许使用存储函数和用户定义函数。
(3)不允许使用存储过程和函数参数。
(4)不允许使用变量(系统变量、用户定义变量和存储程序的局部变量)。
(5)不允许子查询。
(6)计算列在定义时可以引用其他的计算列,但只能引用表定义中较早出现的列。
(7)可以在计算列上创建索引,但不能在VIRTUAL类型的计算列上创建聚集索引。
mysql> create table sales(
-> goods_id int primary key,
-> goods_name char(20),
-> unit_price int,
-> quantity int,
-> amount int generated always as (unit_price*quantity));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into sales(goods_id,goods_name,unit_price,quantity) values(100101,'Apple',2,4);
Query OK, 1 row affected (0.00 sec)
mysql> select * from sales;
+----------+------------+------------+----------+--------+
| goods_id | goods_name | unit_price | quantity | amount |
+----------+------------+------------+----------+--------+
| 100101 | Apple | 2 | 4 | 8 |
+----------+------------+------------+----------+--------+
1 row in set (0.00 sec)
可见,计算列的默认类型为VIRTUAL。
mysql> show create table sales\G
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`goods_id` int(11) NOT NULL,
`goods_name` char(20) DEFAULT NULL,
`unit_price` int(11) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`amount` int(11) GENERATED ALWAYS AS ((`unit_price` * `quantity`)) VIRTUAL,
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
去式
create table json_tab
(
id int unsigned primary key auto_increment comment '主键',
json_info json comment 'json数据',
json_id int generated always as (json_info -> '$.id') comment 'json数据的虚拟字段',
index json_info_id_idx (json_id)
)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。