这期内容当中小编将会给大家带来有关怎么理解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));,