返回顶部
首页 > 资讯 > 数据库 >怎么理解MySQL 5.7中的Generated Column
  • 891
分享到

怎么理解MySQL 5.7中的Generated Column

2024-04-02 19:04:59 891人浏览 独家记忆
摘要

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

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

 正文 

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

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

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


  1. CREATE TABLE triangle ( 

  2. sidea DOUBLE, 

  3. sideb DOUBLE, 

  4. sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))); 


  5. INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8); 

    查询结果: 


  6. mysql> SELECT * FROM triangle; 

  7. +-------+-------+--------------------+ 

  8. | sidea | sideb | sidec | 

  9. +-------+-------+--------------------+ 

  10. | 1 | 1 | 1.4142135623730951 | 

  11. | 3 | 4 | 5 | 

  12. | 6 | 8 | 10 | 

  13. +-------+-------+--------------------+ 

    这个例子就足以说明Generated Columns是什么,以及怎么使用用了。 


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 Golumn的话,可能在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) 


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

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

  1. 将generated column定义为 "除以0" 


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


  3. mysql> create table t( x int, y int, z int generated always as( x / 0)); 

  4. Query OK, 0 rows affected (0.22 sec) 


  5. mysql> insert into t(x,y) values(1,1); 

  6. 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. mysql> insert into t(x,y) values(1,0); 

  4. 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. 



定义显然不合法的Generated Column 

 如果我们将generated column定义为 "x列+y列",很明显,x列或y列都是数值型,如果我们将x列或y列定义(或修改)为字符型(当然,实际使用时应该不会有人傻到这样去做),则预期会报错,然而并没有,如下所示,我们可以正常创建。 

  1.  mysql> create table t( x int, y varchar(100), z int generated always as( x + y)); 

  2.  Query OK, 0 rows affected (0.13 sec) 


  3. 并且插入如下这样的数据也不会出错: 


  4. mysql> insert into t(x,y) values(1,'0'); 

  5. Query OK, 1 row affected (0.01 sec) 


  6. mysql> select * from t; 

  7. +------+------+------+ 

  8. | x | y | z | 

  9. +------+------+------+ 

  10. | 1 | 0 | 1 | 

  11. +------+------+------+ 

  12. 1 row in set (0.00 sec) 

但是对于MySQL无法处理的情况,则会报错: 

  1. mysql> insert into t(x,y) values(1,'x'); 

  2. ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'x' 


  3. Generated Column上创建索引 


  4. 同样,我们可以在generated column上建立索引,建立索引以后,能够加快查找速度,如下所示: 


  5. mysql> create table t(x int primary key, y int, z int generated always as (x / y), unique key idz(z)); 

  6. Query OK, 0 rows affected (0.11 sec) 


  7. mysql> show create table t\G 

  8. *************************** 1. row *************************** 

  9. Table: t 

  10. Create Table: CREATE TABLE `t` (

  11.   `x` int(11) NOT NULL,

  12.   `y` int(11) DEFAULT NULL,

  13.   `z` int(11) GENERATED ALWAYS AS (x / y) VIRTUAL,

  14.   PRIMARY KEY (`x`),

  15.   UNIQUE KEY `idz` (`z`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 

  16. 1 row in set (0.01 sec) 


并且,我们可以创建普通索引和唯一索引,如果是唯一索引,在违反了唯一性约束时,进行报错: 


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

  2. Query OK, 1 row affected (0.02 sec) 


  3. mysql> insert into t(x,y) values(2,2); 

  4. ERROR 1062 (23000): Duplicate entry '1' for key 'idz' 

所以,在使用MySQL5.7时,还需要对Generated Column有所了解,才能够解决一些以前没有遇到过的问题。 



  1. 索引的限制 

  1. 虽然一般情况下都应该使用Virtal Generated Column,但是,目前使用Virtual Generated Column还有很多限制,包括: 



  2. 聚集索引不能包含virtual generated column 


  3. mysql> create table t1(a int, b int , c int GENERATED ALWAYS AS (a / b), primary key(c)); 

  4. ERROR 3106 (HY000): 'Defining a virtual generated column as primary key' is not supported for generated columns. 


  5. mysql> create table t1(a int, b int , c int GENERATED ALWAYS AS (a / b) STORED, primary key(c)); 

  6. Query OK, 0 rows affected (0.11 sec) 


  7. 不能在Virtual Generated Column上创建全文索引和空间索引,这个在之后的MySQL版本中有望解决(Inside君咋记得Stored Column上市可以的呢?)。 


  8. Virtual Generated Column不能作为外键 


  9. 创建generated column(包括virtual generated column 和stored generated column)时不能使用非确定性的(不可重复的)函数 


  10. mysql> ALTER TABLE `t1` ADD p3 DATE GENERATED ALWAYS AS (curtime()) virtual; 

  11. ERROR 3102 (HY000): Expression of generated column 'p3' contains a disallowed function. 


  12. mysql> ALTER TABLE `t1` ADD p3 DATE GENERATED ALWAYS AS (curtime()) stored; 

  13. ERROR 3102 (HY000): Expression of generated column 'p3' contains a disallowed function. 



  1. Generated Column上创建索引与Oracle的函数索引的区别 

  1. 介绍完MySQL在Generated Column上的索引,熟悉oracle的同学这时候可能会想起Oracle的函数索引,在MySQL的Generated Column列上建立索引与Oracle的函数索引比较类似,又有所区别: 


  2. 例如有一张表,如下所示: 


  3. mysql> CREATE TABLE t1 (first_name VARCHAR(10), last_name VARCHAR(10)); 

  4. Query OK, 0 rows affected (0.11 sec) 


  5. 假设这时候需要建一个full_name的索引,在Oracle中,我们可以直接在创建索引的时候使用函数,如下所示: 


  6. alter table t1 add index full_name_idx(CONCAT(first_name,' ',last_name)); 

  7. 但是,上面这条语句在MySQL中就会报错。在MySQL中,我们可以先新建一个Generated Column,然后再在这个Generated Column上建索引,如下所示: 


  8. mysql> alter table t1 add column full_name VARCHAR(255) GENERATED ALWAYS AS (CONCAT(first_name,' ',last_name)); 


  9. mysql> alter table t1 add index full_name_idx(full_name); 

乍一看,MySQL需要在表上增加一列,才能够实现类似Oracle的函数索引,似乎代价会高很多。但是,我们在第2部分说过,对于Virtual Generated Column,MySQL只是将这一列的元信息保存在数据字典中,并不会将这一列数据持久化到磁盘上,因此,在MySQL的Virtual Generated Column上建立索引和Oracle的函数索引类似,并不需要更多的代价,只是使用方式有点不一样而已。 

上述就是小编为大家分享的怎么理解MySQL 5.7中的Generated Column了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解MySQL 5.7中的Generated Column

本文链接: https://lsjlt.com/news/66960.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解MySQL 5.7中的Generated Column
    这期内容当中小编将会给大家带来有关怎么理解MySQL 5.7中的Generated Column,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  正文&n...
    99+
    2024-04-02
  • MySQL中的函数索引(Generated Column)及一次SQL优化
    MySQL 中是没有 Oracle 的函数索引功能的,把 MySQL 的 Generated Column 称为“函数索引”并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为“衍生列”。 Generated Colum...
    99+
    2016-08-19
    MySQL中的函数索引(Generated Column)及一次SQL优化
  • 怎么理解MySQL 5.7 Online DDL Overview
    这期内容当中小编将会给大家带来有关怎么理解MySQL 5.7 Online DDL Overview,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 ...
    99+
    2024-04-02
  • 怎样解释MySQL 5.7中sql_mode的含义
    这篇文章给大家介绍怎样解释MySQL 5.7中sql_mode的含义,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 MySQL 5.7版本中sql_mod...
    99+
    2024-04-02
  • 怎么使用PostgreSQL 12中的generated columns
    这篇文章主要介绍“怎么使用PostgreSQL 12中的generated columns”,在日常操作中,相信很多人在怎么使用PostgreSQL 12中的generated columns问题上存在疑惑...
    99+
    2024-04-02
  • MySQL 5.7中REPLACE语句怎么用
    这篇文章主要介绍MySQL 5.7中REPLACE语句怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! REPLACE类似INSERT,会以主...
    99+
    2024-04-02
  • 如何理解MySQL 5.7中的关键字和保留字
    如何理解MySQL 5.7中的关键字和保留字,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 最近在将数据从O...
    99+
    2024-04-02
  • 怎么在CentOS 7中安装MySQL 5.7
    今天就跟大家聊聊有关怎么在CentOS 7中安装MySQL 5.7,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。本文测试环境:CentOS 7 64...
    99+
    2024-04-02
  • 怎么解决MySQL 5.7中定位DDL被阻塞的问题
    这篇文章主要为大家展示了“怎么解决MySQL 5.7中定位DDL被阻塞的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么解决MySQL 5.7中定位DDL...
    99+
    2024-04-02
  • MySQL中怎么使用Generated Columns + index代替函数索引
    这篇文章主要讲解了“MySQL中怎么使用Generated Columns + index代替函数索引”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQ...
    99+
    2024-04-02
  • mysql报unknown column错误怎么解决
    当 MySQL 报 unknown column 错误时,通常是因为查询语句中引用了不存在的列名。要解决这个问题,可以按照以下步骤进...
    99+
    2024-04-16
    mysql
  • Mysql 5.7中忘记root密码怎么办
    这篇文章给大家介绍Mysql 5.7中忘记root密码怎么办,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 修改mysql参数文件:[root@test ...
    99+
    2024-04-02
  • MySQL 5.7中PREPARE、EXECUTE、DEALLOCATE语句怎么用
    小编给大家分享一下MySQL 5.7中PREPARE、EXECUTE、DEALLOCATE语句怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们...
    99+
    2024-04-02
  • mysql中column的用法是什么
    在MySQL中,column是指表格中的一列,用来存储特定类型的数据。每个column都有一个名称和数据类型,用来定义该列存储的数据...
    99+
    2024-05-23
    mysql
  • mysql中column的作用是什么
    在MySQL中,column(列)是指数据库表中的一个字段,用于存储表中的数据。每个列都有一个特定的数据类型,可以存储不同类型的数据...
    99+
    2024-05-23
    mysql
  • 怎么在CentOS 7系统中安装mysql 5.7
    这期内容当中小编将会给大家带来有关怎么在CentOS 7系统中安装mysql 5.7,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、下载并安装MySQL官方的Yum R...
    99+
    2024-04-02
  • MySQL 5.7中怎么创建用户并授权
    这期内容当中小编将会给大家带来有关MySQL 5.7中怎么创建用户并授权,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 --创建用户mysql...
    99+
    2024-04-02
  • 怎么理解MySQL中的MVCC
    这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。关系数据库管理系统使用MVCC(Multiversi...
    99+
    2024-04-02
  • 怎么理解MySQL中的table_id
    本篇内容介绍了“怎么理解MySQL中的table_id”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 t...
    99+
    2024-04-02
  • MySQL中的锁怎么理解
    本篇内容主要讲解“MySQL中的锁怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中的锁怎么理解”吧!01. 怎么认识"锁"...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作