MySQL中的Generated Column列(计算列)

MySQL中的Generated Column列(计算列)

MySQL的Generated Column又称为虚拟列或计算列。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类型的计算列上创建聚集索引。

三、计算列举例

1、表的定义

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)

2、插入数据

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)

3、查看创建表的语句

可见,计算列的默认类型为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)
)

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/107806406
今日推荐