MySQL表生成列(Generated Columns)的使用说明

本文介绍了MySQL中的生成列,包括虚拟列和存储列的特性。虚拟列在读取时计算,不占用存储空间,适用于如concat(`first_name`,' ',`last_name`)等需求。创建和修改表时可以添加此类列,无需在插入或更新时提供其值。此外,还提供了添加虚拟列的SQL示例。" 99539506,8736162,使用Socket实现机器人问答,"['网络编程', '套接字', '通信协议', 'Unix', '网络连接']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址

MySQL的表生成列通常又叫做虚拟列计算列。这个生成列的值是在列定义时包含了一个计算表达式计算得到的,有两种类型的生成列:

  • Virtual(虚拟):这个类型的列会在读取表记录时自动计算此列的结果并返回。
  • Stored(存储):这个类型的列会在表中插入一条数据时自动计算对应的值,并插入到这个列中,那么这个列会作为一个常规列存在表中。

虚拟生成列有时候比存储生成列更有用,因为它不会占用存储空间。

假如有一个应用,需要添加一个full_name列,值是first_name和last_name的组合即concat(`first_name`,' ',`last_name`),在读取数据时,你可以使用这个虚拟列来代替表达式查询语句,它会自动动态计算full_name列的值。

mysql> CREATE TABLE `employees` (
`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,
### 创建每日日期 为了在 MySQL 5.6 中创建一个包含每天日期的格,可以按照如下方式定义结构并填充初始数据。考虑到 MySQL 5.6 不具备某些高级特性如窗口函数或递归查询,因此采用存储过程来实现批量插入。 #### 定义结构 首先,设计一张简单的用来保存每一天的具体信息: ```sql CREATE TABLE daily_dates ( date_value DATE NOT NULL PRIMARY KEY, day_of_week TINYINT UNSIGNED GENERATED ALWAYS AS (DAYOFWEEK(date_value)) VIRTUAL COMMENT '星期几', week_number INT GENERATED ALWAYS AS (WEEK(date_value, 3)) VIRTUAL COMMENT '一年中的第几周' ); ``` 此段SQL语句创建了一个名为 `daily_dates` 的新,其中包含了三个字段:一个是作为主键使用的实际日期 (`date_value`) ,另一个是由系统自动生成示一周内具体哪一天的小整数值(`day_of_week`)以及计算得出的一年内属于哪个星期(`week_number`). 这里需要注意的是,在MySQL 5.6 版本中并不支持虚拟(VIRTUAL COLUMNS),所以如果要兼容这个版本,则需要去掉这两个生成达式的部分[^1]。 调整后的 SQL 如下所示: ```sql CREATE TABLE daily_dates ( date_value DATE NOT NULL PRIMARY KEY ); ``` #### 插入初始化数据 接下来编写一段存储过程用于向上述建立好的里面填充值。这段代码会从给定起始年份的第一天开始直到结束年的最后一天为止逐条记录每一个单独的日历日。 ```sql DELIMITER $$ CREATE PROCEDURE populate_daily_dates(IN start_year YEAR, IN end_year YEAR) BEGIN DECLARE current_date DATE; SET current_date = CONCAT(start_year,'-01-01'); WHILE YEAR(current_date) <= end_year DO INSERT INTO daily_dates VALUES (current_date); SET current_date = ADDDATE(current_date, INTERVAL 1 DAY); END WHILE; END$$ DELIMITER ; ``` 调用此存储过程即可完成指定范围内所有自然日的数据录入工作。例如想要获取2023全年的日期就可以执行下面这条命令: ```sql CALL populate_daily_dates(2023, 2023); ``` 这样就完成了针对 MySQL 5.6 环境下的每日日期的设计与构建[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晶格点阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值