怎么理解MySQL 5.7中生成的列

  介绍

这期内容当中小编将会给大家带来有关怎么理解MySQL 5.7中生成的列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

  ,正文,

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

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

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


<李>

  创建表triangle  (,

<李>

  sidea翻倍,,

<李>

  sideb翻倍,,

<李>

  sidec双AS  (√sidea  *, sidea  +, sideb  *, sideb)));,


<李>

  INSERT  INTO  triangle  (sidea, sideb),值(1,1),(3、4),(6、8);,

查询结果:,


<李>

  mysql>, SELECT  *,从三角形;,

<李>

+ - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +,

<李>

|, sidea  |, sideb  |, sidec  |,

<李>

+ - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +,

<李>

|, 1, |, 1, |, 1.4142135623730951, |,

<李>

|, 3, |, 4, |, 5, |,

<李>

|, 6, |, 8, |, 10, |,

<李>

+ - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +,

这个例子就足以说明生成的列是什么,以及怎么使用用了只


<强>生成虚拟列与存储生成的列的区别,

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

存储生成的列性能较差,见这里,

如果需要存储生成Golumn的话,可能在生成的列上建立索引更加合适,见本文第4部分的介绍,

综上,一般情况下,都使用虚拟生成的列,这也是MySQL默认的方式,如果使用存储生成的列,前面的建表语句将会是下面这样,即多了一个存储关键字:,


<李>

  创建表:创建表“三角形”,(,

<李>

  ,“sidea”双重默认为空,,

<李>

  ,“sideb”双重默认为空,,

<李>

  生成,“sidec”双总是AS  (SQRT (sidea  *, sidea  +, sideb  *, sideb)),存储),


<>强如果对生成的列做一些破坏行为会怎么样 <强大? <强>,

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

<李>

  将生成的列定义为,“除以0“,


<李>

  如果我们将生成的列定义为,“x列/0“,MySQL并不会直接报错,而是在插入数据时报错,并提示“错误1365(22012):除0“,


<李>

  mysql>,创建表t (, x , int, y  int,, z  int 生成总是(,x/0));,

<李>

  查询好,,0行affected (0.22秒),


<李>

  mysql>, insert  into  t (x, y),值(1,1);,

<李>

  错误1365,(22012):,除0,



<>强插入恶意数据,

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


<李>

  mysql>,创建表t (, x , int, y  int,, z  int 生成总是(,x/y));,

怎么理解MySQL 5.7中生成的列