mysql5.7 生成列 generated column

生成列的值是根据列定义中的表达式计算得出的。

mysql5.7支持两种类型的生成列:

1、virtual 生成列:当从表中读取记录时,才计算该列值。不会把数据持久化在硬盘上。

2、stored 生成列:向表中写入记录时,计算该列值,并作为常规列持久化存储在硬盘上。

所以 virtual 相较于 stored 需要的的存储空间更少,如果未指定生成列类型,mysql5.7 默认生成列类型为 virtual。

定义生成列的语法:

col_name data_type [GENERATED ALWAYS] AS (expression)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT ‘string‘]

我们创建一个表,指定其中一个字段为生成列。

CREATE TABLE test (
    id INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,
    chinese DOUBLE NOT NULL DEFAULT ‘0‘,
    math DOUBLE NOT NULL DEFAULT ‘0‘,
    english DOUBLE NOT NULL DEFAULT ‘0‘,
    total_score DOUBLE AS (chinese + math + english),
    PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

我们向表中插入一条数据

insert into test(chinese, math, english) values(66, 72, 54);
select * from test;

注意,生成的列不允许我们人为的指定值,这会引发ERROR 3105的错误。

如果要在 insert 语句中包含 total_score 字段名,则只能将其值设为 DEFAULT

insert into test(chinese, math, english, total_score) values(33, 44, 55, DEFAULT);

如果表已经存在了,我们可以通过alter table语句来创建,修改,删除生成列。

alter table test add column times_score double generated always as (chinese * math * english) stored;

修改生成列的数据类型和表达式

alter table test modify column times_score float generated always as (chinese * math * english * 10) stored;

重命名生成的列

alter table test change times_score times_score_new float generated always as (chinese * math * english * 10) stored;

删除生成的列

alter table test drop column times_score_new;

virtual 列不能更改为 stored 的生成列,反之亦然。只能先删除,然后再重新添加

alter table test drop column total_score;
alter table test add column total_score double generated always as (chinese + math + english) stored;

表中的常规字段,可以修改为 stored 生成列,但不能是 virtual 生成列

alter table test modify column chinese double generated always as (math + 1) stored;

stored 生成列可以修改为常规字段,值为生成值

alter table test modify column total_score double;

原文地址:https://www.cnblogs.com/jkko123/p/10176722.html

时间: 2024-10-17 13:05:53

mysql5.7 生成列 generated column的相关文章

MySQL5.7之Json Column和Generated Column

MySQL5.7新增两种字段类型:Json和Generated,Generated型的产生和Json的关系密不可分,如果没有Generated类型,Json类型在强大,生产中可能也无法使用,因为Json不支持索引,但是如果要查询Json里的数据,没有索引就是全表扫描,在执行效率上肯定是不能用于生产环境的,但是有了Generated类型就不同了,Generated类型简单地说是一个虚拟字段,值是不可更新的,值来源其他字段或者字段间计算或是转化而来的,这种类型是可以创建索引,利用Generated的

mysql中生成列与JSON类型的索引

MySQL中支持生成列,生成列的值是根据列定义中包含的表达式计算的. 一个简单的例子来认识生成列! CREATE TABLE triangle( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle(sidea, sideb) VALUES(3,4),(6,8),(5,12); mysql> select * from triangle;

datagrid动态生成列并动态赋值

这周接到的任务是动态生成某datagrid的标题,并且要能够根据动态生成的标题来再去数据库中找到相应的值并拼接赋值上去. 项目经理给我的静态页面如下: 左边一列为车型,右边的上面是零件号,下面是固定的,直接循环生成就行,但是数量不一定,需要动态生成.里面的数据是自动加载的. 后台数据库中能够得到的数据大概是这个形式: 这个问题的难点如下: 1.动态生成datagrid的column. 2.将SQL拿出来的数据拼接成前台需要的横行形式,也就是列转行. 先说下解决的思路和方法. 首先是datagri

Oracle 11g 虚拟列 Virtual Column介绍

Oracle 11G 虚拟列 Virtual Column Oracle 11G 在表中引入了虚拟列,虚拟列是一个表达式,在运行时计算,不存储在数据库中,不能更新虚拟列的值. 定义一个虚拟列的语法: column_name [datatype] [GENERATED ALWAYS] AS [expression] [VIRTUAL] 1.虚拟列可以用在select,update,delete语句的where条件中,但是不能用于DML语句 2.可以基于虚拟列来做分区 3. 可以在虚拟列上建索引,o

MySQL 5.7新特性之generated column

MySQL 5.7引入了generated column,这篇文章简单地介绍了generated column的使用方法和注意事项,为读者了解MySQL 5.7提供一个快速的.完整的教程.这篇文章围绕以下几个问题展开: generated column是什么 virtual column与stored column的区别 如果我对generated column做一些破坏行为会怎么样 generated column上创建索引 generated column上创建索引与Oracle的函数索引的

wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序

环境Win10 VS2019 .Net Framework4.8 在wpf中,如果为一个DataGrid绑定到一个数据源,默认情况下DataGrid会为数据源类型的每个属性生成一个列(Column)对象.但并没有简单的方式用来控制列的生成顺序. DataGrid提供了两个与自动生成列有关的事件,分别是: AutoGeneratingColumn 会在为每个属性创建列时引发,引发时列已经创建完毕,在这个事件中可以: 通过e.Column获取已经创建的列对象,并对其进行修改. 通过将e.Cancel

WPF DataGrid动态生成列的单元格背景色绑定

原文:WPF DataGrid动态生成列的单元格背景色绑定 <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Column.DisplayIndex}" Value="1"> <Setter Property="Background" Value="{Binding RelativeSource={RelativeSour

MySQL中的函数索引(Generated Column)及一次SQL优化

MySQL 中是没有 Oracle 的函数索引功能的,把 MySQL 的 Generated Column 称为"函数索引"并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为"衍生列". Generated Column 是什么 Generated Column 的值是根据其定义的表达式所计算而来的,下面使用官方文档中的例子做个简单介绍. 有一张表存储直角三角形的三条边长,大家都知道,根据直角三角形的边长公式,斜边的长度可以通过另外两条边长计算得到,这样

在 SharePoint 2013中使用 RelatedItems 列(Site column)

本文讲述 在 SharePoint 2013中使用 RelatedItems 列(Site column). RelatedItems 一个隐藏的 Site column,用于存储与当前列表项(List Item) 有关的其他文档或列表项. 比较有意思的是,添加和删除RelatedItem都是在 View Form,而不失Edit Form: 那么这个列既然是隐藏字段,怎么把它修改成可以加入到其他列表和文档库的公共字段(Site column)呢? a.打开站点设置(Site settings)