美文网首页
mysql Generated Columns

mysql Generated Columns

作者: 意大利大炮 | 来源:发表于2021-08-05 14:58 被阅读0次

官网

  • 生成列不需要维护,依赖于一个已存在的列
  • 生成分为两种:虚拟的、实际的。虚拟列不存储在磁盘中,实际的则和正常列一样存储在磁盘
语法
col_name data_type [GENERATED ALWAYS] AS (expr)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT 'string']
  • VIRTUAL关键字指示如何存储列值, 这STORED 对列的使用有影响:

    • VIRTUAL: 不存储列值,而是在读取行时,在任何 BEFORE触发器之后立即评估。虚拟列不占用存储空间。
      InnoDB支持虚拟列的二级索引。请参阅 第 13.1.18.8 节,“二级索引和生成的列”
    • STORED:在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。
  • 生成的列表达式必须遵守以下规则。如果表达式包含不允许的构造,则会发生错误。

    • 允许使用文字、确定性内置函数和运算符。如果给定表中的相同数据,则函数是确定性的,多次调用产生相同的结果,独立于连接的用户。非确定性且不符合此定义的函数示例:CONNECTION_ID(), CURRENT_USER(), NOW().

    • 不允许存储函数和可加载函数。

    • 不允许使用存储过程和函数参数。

    • 不允许使用变量(系统变量、用户定义变量和存储的程序局部变量)。

    • 不允许子查询。

    • 生成的列定义可以引用其他生成的列,但只能引用表定义中较早出现的列。生成的列定义可以引用表中的任何基本(非生成)列,无论其定义发生得早还是晚。

    • AUTO_INCREMENT属性不能在生成的列定义中使用。

    • AUTO_INCREMENT列不能用作生成的列定义中的基列 。

    • 从 MySQL 5.7.10 开始,如果表达式求值导致截断或向函数提供不正确的输入,则 CREATE TABLE语句以错误终止并且 DDL 操作被拒绝。

问题

增加虚拟列时,必须使用确定性的函数

  • 例如
    使用UNIX_TIMESTAMP(时间转时间戳)会报错
sql: alter table table add column int_value int(10) GENERATED ALWAYS AS (convert(UNIX_TIMESTAMP(ctime)) USING INT));

 Expression of generated column 'pd_int1' contains a disallowed function.

但可以使用FROM_UNIXTIME(时间戳转时间)

相关文章

网友评论

      本文标题:mysql Generated Columns

      本文链接:https://www.haomeiwen.com/subject/nrvmvltx.html