MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的。

一个简单的例子来认识生成列!

CREATE TABLE triangle(
sidea DOUBLE,
sideb DOUBLE,
sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
);INSERT INTO triangle(sidea, sideb)  VALUES(3,4),(6,8),(5,12);mysql> select * from triangle;  #插入数值的时候并没有插入c的值,但是查询的时候,还是有了c值
+-------+-------+-------+
| sidea | sideb | sidec |
+-------+-------+-------+
|     3 |     4 |     5 |
|     6 |     8 |    10 |
|     5 |    12 |    13 |
+-------+-------+-------+
3 rows in set (0.00 sec)mysql>

生成列中的值,是根据生成列的定义计算出来的!

生成列的定义如下:

col_name data_type [GENERATED ALWAYS] AS (expression)[VIRTUAL | STORED] [NOT NULL | NULL][UNIQUE [KEY]] [[PRIMARY] KEY][COMMENT 'string']#AS表达式表示生成列并用于计算生成列的表达式。As之前的GENERATED ALWAYS可以让生成列的性质更明确(应该没什么作用,反正是可以省略的)!#VIRTUAL | STORED 关键字表示列值的存储方式
  • VIRTUAL: 不存储列值,但在读取值之前立即计算此列的数值,虚拟列不占存储空间,innodb支持虚拟列上的二级索引。为默认的存储方式。
  • STORED:插入或更新时,将计算存储列的值,并且占用存储空间。
 生成列的表达式必须遵循以下的规则,否则会报错:
  1. 允许使用字符串,运算符和确定性内置函数。对于给定的相同的数据库,不同连接的用户调用会产生相同的结果,则这个函数时确定的。now()函数就不是确定性函数。
  2. 不允许使用子查询,参数,变量,存储函数(stored functions)和用户自定义的函数。
  3. 生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。生成的列定义可以引用表中的任何基本(非生成)列,无论其定义是早期还是稍后发生。
  4. auto_increment属性不能再生成列的定义中使用。
  5. 一个AUTO_INCREMENT列不能用作在生成的列定义的基柱(An AUTO_INCREMENT column cannot be used as a base column in a generated column definition.)
  6. 从MySQL 5.7.10开始,如果表达式求值导致截断或向函数提供不正确的输入,则 CREATE TABLE语句将以错误终止并拒绝DDL操作

生成列的作用(可能不太准确):

  • 虚拟生成的列可用作简化和统一查询的方法。可以将复杂条件定义为生成列,并从表上的多个查询引用,以确保他们全部使用完全相同的条件。
  • 存储生成的列可以用作物化缓存,用于复杂的条件,这些条件在运行中计算成本很高。
  • 生成列可以模拟功能索引,利用生成列定义功能表达式对其进行索引。例如对JSON数据类型。对于存储的生成列,这种方法缺点是存储两次,一次是生成列的值,另一次是索引。
  • 如果生成的列已编制索引,则优化程序将识别与列定义匹配的查询表达式,并在查询执行期间根据需要使用列中的索引,即使查询未按名称直接引用该列也是如此。

如下一个含有json类型字段的表:

CREATE TABLE json_test (id INT auto_increment PRIMARY KEY,userinfo json
);#插入数据INSERT INTO json_test(userinfo) VALUES('{"name":"libai","address":"china","email":"libai@163.com"}');
INSERT INTO json_test(userinfo) VALUES('{"name":"obama","address":"miguo","email":"libai@gmail.com"}');
INSERT INTO json_test(userinfo) VALUES('{"name":"putin","address":"russia","email":"putin@gmail.com"}');#

给表中添加生成列

alter table json_test add column user_name varchar(40) generated always  as (userinfo->"$.name") virtual;#查看表中的数据
mysql> select * from json_test;
+----+--------------------------------------------------------------------+-----------+
| id | userinfo                                                           | user_name |
+----+--------------------------------------------------------------------+-----------+
|  1 | {"name": "libai", "email": "libai@163.com", "address": "china"}    | "libai"   |
|  2 | {"name": "obama", "email": "libai@gmail.com", "address": "miguo"}  | "obama"   |
|  3 | {"name": "putin", "email": "putin@gmail.com", "address": "russia"} | "putin"   |
+----+--------------------------------------------------------------------+-----------+
3 rows in set (0.00 sec)#在表中插入数据user_name列的数值会自动计算,这时候,我们就可以对user_name列添加索引!

转载于:https://www.cnblogs.com/wxzhe/p/9763777.html

mysql中生成列与JSON类型的索引相关推荐

  1. MySQL中的列类型之字符串类型总结

    关联博文: MySQL中数值类型(列类型)与显示宽度 MySQL中的列类型之字符串类型总结 在SQL中,将字符串类型分为了六类:char,varchar,text,blob,enum和set. 类型 ...

  2. mysql中生成字符串对应的英文字母(拼音首字母)

    mysql中生成字符串对应的英文字母(拼音首字母)的存储过程,触发器和函数 1.规则 1.1.输入字符串长度255(可变),输出字符串10(可变) 1.2.对于全英文字母或数字,输出空格后的首字符,均 ...

  3. Mysql使用函数json_extract处理Json类型数据

    Mysql使用函数json_extract处理Json类型数据 1. 需求概述 2. json_extract简介 2.1 函数简介 2.2 使用方式 2.3 注意事项 3. 实现验证 3.1 建表查 ...

  4. MySQL中的char和varchar类型

    文章目录 1 MySQL中的char和varchar类型 1 MySQL中的char和varchar类型 CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形式如下: 字符串类型(M) ...

  5. MySQL中的日期和时间类型

    文章目录 1 MySQL中的日期和时间类型 1 MySQL中的日期和时间类型 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型.其中,YEAR类型表示年, ...

  6. 【mysql】mysql 中 text,longtext,mediumtext 字段类型的意思, 以及区别

    mysql 中 text,longtext,mediumtext 字段类型的意思, 以及区别 mysql 中 text,longtext,mediumtext 字段类型区别为:字节限制不同.I/O 不 ...

  7. mysql 不识别欧元符号_将欧元和美元符号插入MySQL中的列?

    为此,将CASE语句与UPDATE命令一起使用.让我们首先创建一个表-mysql> create table DemoTable1874 ( Id int NOT NULL AUTO_INCRE ...

  8. MySQL中数组内的JSON数据中获取值

    MySQL中JSON数据获取值 1.MySQL中JSON数据中获取值 数据源: {"observeTruth": "111","preventHume ...

  9. Mysql中主键和外键和索引

    Mysql中主键和外键和索引 1.主键和外键是什么 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是 ...

最新文章

  1. 使用 NSUserDefaults 存储字典的一个坑
  2. 从强制卸载Office到强制安装WPS
  3. 通过命令行使用 JAX-WS调用webservice
  4. python dlib学习(十):换脸
  5. vue 动态组件名_vue动态加载组件mounted无法获取dom的解决思路
  6. 第一个c++泛型函数(即模板)
  7. vue理由设置_在你的下一个Web应用中使用Vue.js的三个理由
  8. httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:88
  9. php ssh tab补全,bash的按TAB键自动补全(自动完成)的原理与扩展
  10. 【高校宿舍管理系统】第零章 项目功能和技术路线
  11. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析(1)
  12. 【分段哈希】H. Paint the Wall
  13. Sudo环境变量继承
  14. winform 固定splitContainer某一部分大小
  15. Sql server2008的使用
  16. 推荐一款免费的数据库管理工具,比Navicat还要好用,功能还很强大!
  17. 2022前端面试(一面面试题)
  18. C++基础(1)- 声明(前向声明 Forward Declaration)与定义
  19. 为什么培训机构出身的程序员,不敢告诉任何人?
  20. 分分钟进阶MongoDB

热门文章

  1. sicily 1156 ——虽然Wrong error(原因尚未查明),但温习了一下基础知识
  2. 一天一小步_我学C#入门精典_第八天
  3. 保姆级教程 | TensorFlow-YOLOv3 从本地训练到服务器部署全过程
  4. 开源代码准确率99%+,人脸识别问题真的被解决了吗?
  5. CVPR 2019 | 近日新出论文汇总(含视频目标分割、GAN、度量学习、高效语义分割等主题)...
  6. 开源极速的人脸跟踪-基于OpenTLD与RNet
  7. 顶会 | 腾讯AI Lab 9篇入选论文解读
  8. 首次!阿里达摩院将Pure Transformer 应用于目标重识别ReID!
  9. 毫米波雷达障碍物检测算法介绍
  10. 不知道怎么用GitHub怎么当程序员?拿出十分钟,包你会