MySQL 5.7 引入了一项新特性——生成列(Generated Columns),也称为虚拟列或计算列。这种列的值不是由用户直接输入的,而是根据其他列的值通过一个表达式计算得出。生成列提供了更加灵活的数据建模方式,可以在不增加额外存储开销的情况下,提供额外的数据处理功能。 生成列分为两种类型: 1. **Virtual 生成列**:当从表中读取记录时,系统会实时计算该列的值,这些列的值不会被存储在磁盘上,因此不占用额外的存储空间。这对于基于其他列进行简单计算的情况非常有用,例如上面的例子中 `total_score` 列就是虚拟生成列,它是在读取记录时计算语文、数学和英语三科成绩的总和。 2. **Stored 生成列**:在向表中写入记录时,系统会计算并存储该列的值。与 Virtual 生成列不同,Stored 生成列的值会被持久化存储,这意味着即使在查询时,也不需要重新计算。这在需要频繁访问计算结果,且计算过程复杂或耗时的情况下很有用。 定义生成列的语法如下: ```sql col_name data_type [GENERATED ALWAYS] AS (expression) [VIRTUAL | STORED] [NOT NULL | NULL] [UNIQUE [KEY]] [[PRIMARY] KEY] [COMMENT 'string'] ``` 例如,创建一个包含生成列的表 `test`: ```sql 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 GENERATED ALWAYS AS (chinese + math + english), PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; ``` 在插入数据时,对于生成列,用户通常无法直接指定值。例如,尝试为 `total_score` 指定值会导致错误,但可以使用 `DEFAULT` 关键字让系统自动计算: ```sql INSERT INTO test(chinese, math, english, total_score) VALUES(33, 44, 55, DEFAULT); ``` 对已存在的表,可以使用 `ALTER TABLE` 语句来添加、修改或删除生成列。例如,添加一个 Stored 生成列 `times_score`: ```sql ALTER TABLE test ADD COLUMN times_score DOUBLE GENERATED ALWAYS AS (chinese * math * english) STORED; ``` 修改生成列的数据类型和表达式: ```sql ALTER TABLE test MODIFY COLUMN times_score FLOAT GENERATED ALWAYS AS (chinese * math * english * 10) STORED; ``` 重命名生成列: ```sql ALTER TABLE test CHANGE COLUMN times_score times_score_new FLOAT GENERATED ALWAYS AS (chinese * math * english * 10) STORED; ``` 删除生成列: ```sql ALTER TABLE test DROP COLUMN times_score_new; ``` 需要注意的是,Virtual 生成列不能直接改为 Stored 生成列,反之亦然,需要先删除再重新添加。而常规字段可以变为 Stored 生成列,但不能变为 Virtual 生成列。 生成列的一个重要应用是在数据库设计中简化数据校验和计算,使得数据的一致性和准确性得到保障,同时减少了应用程序的负担。生成列在数据分析、报表生成以及存储计算结果等方面都有广泛的应用。 MySQL 5.7 的生成列特性为数据库设计提供了新的思路,允许开发者在不增加存储成本的同时,实现更高效的数据处理和管理。在实际项目中,合理利用生成列可以优化数据库结构,提高查询效率,同时也简化了业务逻辑。
- 粉丝: 15
- 资源: 945
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助