mysql5.7 生成列 generated column
生成列的值是根据列定义中的表达式计算得出的。
mysql5.7支持两种类型的生成列:
1、virtual 生成列:当从表中读取记录时,才计算该列值。不会把数据持久化在硬盘上。
2、stored 生成列:向表中写入记录时,计算该列值,并作为常规列持久化存储在硬盘上。
所以 virtual 相较于 stored 需要的的存储空间更少,如果未指定生成列类型,mysql5.7 默认生成列类型为 virtual。
定义生成列的语法:
col_name data_type [GENERATED ALWAYS] AS (expression)[VIRTUAL | STORED] [NOT NULL | NULL][UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string']
我们创建一个表,指定其中一个字段为生成列。
CREATE TABLE test (id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,chinese DOUBLE NOT NULL DEFAULT '0',math DOUBLE NOT NULL DEFAULT '0',english DOUBLE NOT NULL DEFAULT '0',total_score DOUBLE AS (chinese + math + english),PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
我们向表中插入一条数据
insert into test(chinese, math, english) values(66, 72, 54);
select * from test;
注意,生成的列不允许我们人为的指定值,这会引发ERROR 3105的错误。
如果要在 insert 语句中包含 total_score 字段名,则只能将其值设为 DEFAULT
insert into test(chinese, math, english, total_score) values(33, 44, 55, DEFAULT);
如果表已经存在了,我们可以通过alter table语句来创建,修改,删除生成列。
alter table test add column times_score double generated always as (chinese * math * english) stored;
修改生成列的数据类型和表达式
alter table test modify column times_score float generated always as (chinese * math * english * 10) stored;
重命名生成的列
alter table test change times_score times_score_new float generated always as (chinese * math * english * 10) stored;
删除生成的列
alter table test drop column times_score_new;
virtual 列不能更改为 stored 的生成列,反之亦然。只能先删除,然后再重新添加
alter table test drop column total_score;
alter table test add column total_score double generated always as (chinese + math + english) stored;
表中的常规字段,可以修改为 stored 生成列,但不能是 virtual 生成列
alter table test modify column chinese double generated always as (math + 1) stored;
stored 生成列可以修改为常规字段,值为生成值
alter table test modify column total_score double;
转载于:https://www.cnblogs.com/jkko123/p/10176722.html
mysql5.7 生成列 generated column相关推荐
- PostgreSQL 生成列(Generated Columns)教程
PostgreSQL 12 增加新的特性--生成列(Generated Columns),也就是计算列.在之前版本也可以实现,但需要定义函数和触发器,利用该功能可以更容易使用并可以提升性能. 生成列是 ...
- MySQL5.7之Json Column和Generated Column使用介绍
目录 前言 一.MySQL中的Generated Column列(计算列) 二.JSON字段相关查询 三.JSON字段相关写操作 四.JSON字段索引以及Generated字段 五.结束语 前言 My ...
- MySQL表生成列(Generated Columns)的使用说明
原文地址 MySQL的表生成列通常又叫做虚拟列或计算列.这个生成列的值是在列定义时包含了一个计算表达式计算得到的,有两种类型的生成列: Virtual(虚拟):这个类型的列会在读取表记录时自动计算此列 ...
- mysql动态扩展_动态可扩展查询MYSQL5.7JSON+虚拟列+Mybatis
背景:现有业务扩展字段,都存在feature字段,存在语义不清晰以及,难以利用索引查询问题 Mysql 5.7后推出利器,JSON+虚拟列,即实现了业务语义统一,也支持索引查询加速 一.简单描述 My ...
- mysql中生成列与JSON类型的索引
MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, ...
- mysql计算三角形斜边_MySQL 5.7新特性之Generated Column(函数索引)
MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...
- Mysql的组合字段Generated Column
所谓组合字段(自创的名字,没有在网上找到通用的名字),是MySQL5.7加入的新功能,可以定义一个字段,值是其他字段值的组合. 官网中举了一个勾股定理的例子: CREATE TABLE triangl ...
- SQL 中的生成列/计算列以及主流数据库实现
文章目录 什么是生成列? Oracle 中的虚拟列 MySQL 中的生成列 SQL Server 中的计算列 PostgreSQL 中的存储生成列 SQLite 中的生成列 什么是生成列? 在 SQL ...
- mysql generated_MySQL 5.7新特性之Generated Column
这是IMG社区迎来的第一篇投稿,欢迎各位踊跃投稿,共同成长,一起打造最有态度的MySQL社区--IMG.IMG社区的网站,论坛也在完善中,后期会不断推出,目前就让我们在公众账号上讨论吧. IMG官方微 ...
最新文章
- 四种常见的激活函数画图及简单改造
- Easy Summation 预处理 快速幂
- emacs org-mode文件转html文件
- java cxf 搭soa,WebService CXF入门问题 SOA 骑着上帝去环游 - 贪吃蛇学院-专业IT技术平台...
- 在MFC单文档中,如何操作状态栏
- Understanding Clouds from Satellite Images比赛的discussion调研与colab数据集下载配置
- 依赖注入和控制反转的理解,写的太好了。
- Java Web学习总结(41)——Java EE 8 新功能展望
- NSString 和 NSMutableString
- 打包vue项目时报错:Expected indentation of 6 spaces but found 10
- python检测excel是否打开_Python判断远程服务器上Excel文件是否被人打开的方法_学领未来...
- Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏
- matlab创建wps服务器,wps设置云服务器地址(wps放到服务器)
- HashMap底层结构
- 概率论——随机变量、概率分布函数、概率密度函数、联合概率密度
- 迅雷index.html是什么文件,迅雷看看的缓存文件在哪个文件夹
- 社区版pycharm的django创建app失败问题解决
- Python | 小白的 Asyncio 教程
- 数据分析——人力资源
- 团建游戏----气球大赛