首页 > 数据库 >MySQL8.0新特性—生成列

MySQL8.0新特性—生成列

时间:2022-11-27 13:12:06浏览次数:58  
标签:full name employees 特性 生成 generated MySQL8.0 emp date

生成列(generated column)的值是根据列定义中包含的表达式计算得出的。 生成列包含下面两种类型:

  • virtual(虚拟):当从表中读取记录时,将动态计算该列。
  • stored(存储):当向表中写入新记录时,将计算该列并将其存储为常规列。

virtual生成列比stored生成列更有用,因为一个虚拟的列不占用任何存储空间。你可以使用触发器模拟stored生成列的行为。

案例

1. 创建表时

假设你的应用程序从t_employees_generated表中检索数据时,使用full_name表示concat(first_name, ' ', last_name),而不是使用表达式来表示,从而实现虚拟列实时计算full_name

# 创建测试表
mysql> create table if not exists employees.t_employees_generated (
    -> emp_no int(11) not null,
    -> birth_date date not null,
    -> first_name varchar(14) not null,
    -> last_name varchar(16) not null,
    -> gender enum('M', 'F') not null,
    -> hire_date date not null,
    -> full_name varchar(30) as (concat(first_name, ' ', last_name)),
    -> primary key (emp_no),
    -> key name (first_name, last_name)
    -> ) engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected, 1 warning (0.04 sec)

请注意,应该根据虚拟列修改插入语句。你可以这样使用full insert

# 执行插入
mysql> insert into employees.t_employees_generated 
    -> (emp_no, birth_date, first_name, last_name, gender, hire_date) 
    -> values 
    -> (123456, '1987-10-02', 'ABC', 'XYZ', 'F', '2008-07-28');
Query OK, 1 row affected (0.11 sec)

# 验证数据
mysql> select * from employees.t_employees_generated where emp_no = '123456';
+--------+------------+------------+-----------+--------+------------+-----------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | full_name |
+--------+------------+------------+-----------+--------+------------+-----------+
| 123456 | 1987-10-02 | ABC        | XYZ       | F      | 2008-07-28 | ABC XYZ   |
+--------+------------+------------+-----------+--------+------------+-----------+
1 row in set (0.00 sec)

如果要在INSERT语句中包含full_name,就只能将其指定为DEFAULT

# 执行插入
mysql> insert into employees.t_employees_generated 
    -> (emp_no, birth_date, first_name, last_name, gender, hire_date, full_name) 
    -> values 
    -> (123457, '1987-10-02', 'ABC', 'XYZ', 'F', '2008-07-28', DEFAULT);
Query OK, 1 row affected (0.01 sec)

# 验证数据
mysql> select * from employees.t_employees_generated where emp_no = '123457';
+--------+------------+------------+-----------+--------+------------+-----------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | full_name |
+--------+------------+------------+-----------+--------+------------+-----------+
| 123457 | 1987-10-02 | ABC        | XYZ       | F      | 2008-07-28 | ABC XYZ   |
+--------+------------+------------+-----------+--------+------------+-----------+
1 row in set (0.00 sec)

其他值都会引发ERROR 3105:错误,不允许在t_employees_generated表中为生成的列full_name指定值:

mysql> insert into employees.t_employees_generated 
    -> (emp_no, birth_date, first_name, last_name, gender, hire_date, full_name) 
    -> values 
    -> (123458, '1987-10-02', 'ABC', 'XYZ', 'F', '2008-07-28', 'TEST');
ERROR 3105: The value specified for generated column 'full_name' in table 't_employees_generated' is not allowed.

2. 已有表时

如果你已经创建了表并希望添加新的生成列,请执行ALTER TABLE语句。

# 修改表结构 - 新增生成列
mysql> alter table employees.t_employees_generated add hire_date_year year as (year(hire_date)) virtual;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0

# 验证数据
mysql> select * from employees.t_employees_generated where emp_no = '123456';
+--------+------------+------------+-----------+--------+------------+-----------+----------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | full_name | hire_date_year |
+--------+------------+------------+-----------+--------+------------+-----------+----------------+
| 123456 | 1987-10-02 | ABC        | XYZ       | F      | 2008-07-28 | ABC XYZ   |           2008 |
+--------+------------+------------+-----------+--------+------------+-----------+----------------+
1 row in set (0.00 sec)

# 查看表结构
mysql> desc employees.t_employees_generated;
+----------------+---------------+------+-----+---------+-------------------+
| Field          | Type          | Null | Key | Default | Extra             |
+----------------+---------------+------+-----+---------+-------------------+
| emp_no         | int(11)       | NO   | PRI | NULL    |                   |
| birth_date     | date          | NO   |     | NULL    |                   |
| first_name     | varchar(14)   | NO   | MUL | NULL    |                   |
| last_name      | varchar(16)   | NO   |     | NULL    |                   |
| gender         | enum('M','F') | NO   |     | NULL    |                   |
| hire_date      | date          | NO   |     | NULL    |                   |
| full_name      | varchar(30)   | YES  |     | NULL    | VIRTUAL GENERATED |
| hire_date_year | year(4)       | YES  |     | NULL    | VIRTUAL GENERATED |
+----------------+---------------+------+-----+---------+-------------------+
8 rows in set (0.00 sec)

参考

标签:full,name,employees,特性,生成,generated,MySQL8.0,emp,date
From: https://www.cnblogs.com/ciel717/p/16254368.html

相关文章

  • Python项目依赖包生成requirements.txt
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 10:生成器 迭代器 装饰器 闭包
    一:生成器#生成器:为了节约内存,拿到内存地址一边循环一边计算a=(x*2forxinrange(1,8))print(a)print(next(a))print(next(a))<generatorobject<genexpr>at0x00934......
  • linux重置core文件生成目录
    查看/proc/sys/kernel/core_pattern文件或kernel.core_pattern里面的内容默认是core,也就是core文件的生成路径和工作路径一致,如果内容为其他值,那么对应的core文件就会生成......
  • 自动代码生成器类
    packagecode.auto;importcom.baomidou.mybatisplus.core.toolkit.StringPool;importcom.baomidou.mybatisplus.generator.AutoGenerator;importcom.baomidou.myba......
  • 利用特性反射获取额外标注的信息
    需求:我们想得到枚举上面的注释1)枚举类publicenumSex{///<summary>///女///</summary>[CommonAttribute("女")]......
  • Java8新特性
    Java8NashornJavaScriptJava8新特性Java8新特性Nashorn一个javascript引擎。NashornJavaScriptEngine在Java15已经不可用了。这已经在Java11标记为:@de......
  • 重点--微信公众号(事件回调&生成带参数二维码&扫码关注事件&消息模板推送)java版
     1.业务处理(全部业务)importcom.alibaba.fastjson.JSONObject;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.*;impo......
  • 用C#生成随机中文汉字验证码的基本原理
    1、汉字编码原理到底怎么办到随机生成汉字的呢?汉字从哪里来的呢?是不是有个后台数据表,其中存放了所需要的所有汉字,使用程序随机取出几个汉字组合就行了呢?使用后台数据库先将......
  • MybatisPlus的一些高级特性
    1、MybatisPlus多数据源配合导入相关依赖<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</vers......
  • 随机数生成
    知道脑瘫怎么写吗,呢熬脑忒安瘫自己之前写的平衡树博客里面明明有个随机生成值,不看,非要看别人的博客不多说了建议配合这个一起食用,作为对拍的方法先用srand(time(0))去......