MySQL 5.7引入了generated column,这篇文章简单地介绍了generated column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的、完整的教程。这篇文章围绕以下几个问题展开:

  1. generated column是什么
  2. virtual column与stored column的区别
  3. 如果我对generated column做一些破坏行为会怎么样
  4. generated column上创建索引
  5. generated column上创建索引与Oracle的函数索引的区别

1. generated column是什么

generated column是MySQL 5.7引入的新特性,所谓generated column,就是数据库中这一列由其他列计算而得,我们以官方参考手册中的例子予以说明。

例如,知道直角三角形的两条直角边,要求斜边的长度。很明显,斜边的长度可以通过两条直角边计算而得,那么,这时候就可以在数据库中只存放直角边,斜边使用generated column,如下所示:

  1. CREATE TABLE triangle (
  2. sidea DOUBLE,
  3. sideb DOUBLE,
  4. sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
  5. );
  6. INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);

查询结果:

  1. mysql> SELECT * FROM triangle;
  2. +-------+-------+--------------------+
  3. | sidea | sideb | sidec |
  4. +-------+-------+--------------------+
  5. | 1 | 1 | 1.4142135623730951 |
  6. | 3 | 4 | 5 |
  7. | 6 | 8 | 10 |
  8. +-------+-------+--------------------+

2. virtual generated column与stored generated column的区别

在MySQL 5.7中,支持两种generated column,即virtual generated column和stored generated column,前者只将generated column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将generated column持久化到磁盘上,而不是每次读取的时候计算所得。很明显,后者存放了可以通过已有数据计算而得的数据,需要更多的磁盘空间,与virtual column相比并没有优势,因此,MySQL 5.7中,不指定generated column的类型,默认是virtual column。此外:

  • stored generated column性能较差,见这里
  • 如果需要stored generated column的话,可能在generated column上建立索引更加合适,见本文第4部分的介绍

综上,一般情况下,都使用virtual generated column,这也是MySQL默认的方式,如果使用stored generated column,前面的建表语句将会是下面这样,即多了一个stored关键字:

  1. Create Table: CREATE TABLE `triangle` (
  2. `sidea` double DEFAULT NULL,
  3. `sideb` double DEFAULT NULL,
  4. `sidec` double GENERATED ALWAYS AS (SQRT(sidea * sidea + sideb * sideb)) STORED
  5. )

3. 如果我对generated column做一些破坏行为会怎么样

我们已经知道了generated column是什么,并且知道了如何使用generated column,为了避免误用,我们先来进行一些实验,以免在具体使用时出现一些未知的情况。

  • 将generated column定义为 “除以0”

    如果我们将generated column定义为 “x列 / 0”,MySQL并不会直接报错,而是在插入数据时报错,并提示”ERROR 1365 (22012): Division by 0”

  1. mysql> create table t( x int, y int, z int generated always as( x / 0));
  2. Query OK, 0 rows affected (0.22 sec)
  3.  
  4. mysql> insert into t(x,y) values(1,1);
  5. ERROR 1365 (22012): Division by 0
  • 插入恶意数据

  如果我们将generated column定义为 “x列/y列”,在插入数据,如果y列为0的话,同样提示错误,如下所示:

  1. mysql> create table t( x int, y int, z int generated always as( x / y));
  2. Query OK, 0 rows affected (0.20 sec)
  3.  
  4. mysql> insert into t(x,y) values(1,0);
  5. ERROR 1365 (22012): Division by 0

  

  • 删除源列

  如果我们将generated column定义为 “x列/y列”,并尝试删除x列或y列,将提示”ERROR 3108 (HY000): Column ‘x’ has a generated column dependency.”

  1. mysql> create table t( x int, y int, z int generated always as( x / y));
  2. Query OK, 0 rows affected (0.24 sec)
  3. mysql> alter table t drop column x;
  4. ERROR 3108 (HY000): Column 'x' has a generated column dependency.

MySQL 5.7新特性之generated column的更多相关文章

  1. MySQL 5.7新特性之Generated Column(函数索引)

    MySQL 5.7引入了Generated Column,这篇文章简单地介绍了Generated Column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕 ...

  2. MySQL 8.0 新特性梳理汇总

    一 历史版本发布回顾 从上图可以看出,基本遵循 5+3+3 模式 5---GA发布后,5年 就停止通用常规的更新了(功能不再更新了): 3---企业版的,+3年功能不再更新了: 3 ---完全停止更新 ...

  3. [转帖 ]MySQL 5.7 新特性 JSON

    MySQL 5.7 新特性 JSON 的创建,插入,查询,更新 作者: 我不是鱼 (2016-08-31 16:13)分类: MySQL   标签: MySQL JSON MySQL JSON 应用 ...

  4. Mysql 8.0 新特性测试

    Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...

  5. mysql 5.7 ~ 新特性

    mysql 5.7特性 简介:mysql 5.7内存和线程性能方面的优化一 细节优化 参数:  1 innodb_buffer_pool    改进 innodb_buffer_pool可以动态扩大, ...

  6. MySql 5.7 新特性概览

    安全的提升 1.1 在Mysql 8版本中,caching_sha2_password 是一个缺省的认证插见.5.7 版本的客户端支持 caching_sha2_password 的客户端认证. 1. ...

  7. 初识 MySQL 5.6 新特性、功能

    背景: 之前介绍过 MySQL 5.5 新功能.参数,现在要用MySQL5.6,所以就学习和了解下MySQL5.6新的特性和功能,尽量避免踩坑.在后续的学习过程中文章也会不定时更新. 一:参数默认值的 ...

  8. MySQL 5.6新特性 -- Multi-Range Read

    如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问.使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索 ...

  9. 总结一下关于mysql 5.6 新特性

    一直断断续续的看一些mysql特性,今天总结一下,以下是列表,网址 http://mariadb.org/ (也是类似的特性), http://mysql.com/ 最近在看关于mysql新特性的一些 ...

随机推荐

  1. aix 查看内存,CPU 配置信息

    内存lsattr -El mem0cpu lsdev -C |grep procCPU的信息lsattr -El proc0   #bootinfo -r查看物理内存     使用命令#  lsdev ...

  2. android平台修改默认语言的那点事

    转自:https://blog.csdn.net/qinghua0706/article/details/8243858 最近开始做智能机,用的是展讯6820平台,第一个需求就是改默认语言,一般碰到不 ...

  3. scipy.stats与统计学:4个概率分布:N,chi2,F,t

    scipy.stats与统计学:4个概率分布:N,chi2,F,t   四个常用分布的概率密度函数.分布函数.期望.分位数.以及期望方差标准差中位数原点矩: 1,正态分布: from scipy.st ...

  4. Github超棒资源汇总

    Awesome List 中文资源大全 经典编程书籍大全 免费的编程中文书籍索引 awesome-awesomeness-zh_CN https://github.com/jnv/lists awes ...

  5. [Vuex] Perform Async Updates using Vuex Actions with TypeScript

    Mutations perform synchronous modifications to the state, but when it comes to make an asynchronous ...

  6. PHP中一些常用知识点

    1.json字符串转json对象 $data='[{"user_id":"93","price":"52.50"},{& ...

  7. 转发:CentOS下tar压缩排除某个文件夹或文件及解压

     一.压缩 一般直接用tar命令打包很简单,直接使用 tar -zcvf test.tar.gz test 即可. 在很多时候,我们要对某一个目录打包,而这个目录下有几十个子目录和子文件,我们需要在打 ...

  8. MATLAB 统计不同区间中元素的个数

    使用 find 命令: x = :;%生成数组 k = find( x > & x < );%查找大于2小于5的元素的数组下标 size(k,) %统计的元素的个数

  9. Ubuntu安装守护进程supervisor

    Supervisor安装与配置(Linux/Unix进程管理工具) asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel) 为了保证服务能够稳定 ...

  10. Django-ORM 复习

    老师博客 https://www.cnblogs.com/yuanchenqi/articles/6083427.html day51 表与表之间的关系 一对一 一对多(多对一) 多对多 A表依赖B表 ...