MySQL的虚拟字段

MySQL中的虚拟字段指的是不实际存在于表中的逻辑字段,它们是在查询时由一些函数或表达式临时生成的。

参数:虚拟类型
           
MySQL的虚拟字段_第1张图片

在 MySQL 中,字段类型可以分为存储类型(Stored)虚拟类型(Virtual)存储类型是指实际存储在表中的数据类型,如 INT, VARCHAR, TEXT 等。这些数据是持久化的,存在于数据库中。MySQL存储任何生成的标记为STORED的列。这意味着每次插入或更新行时,MySQL都会评估其值并将其存储在磁盘上。换句话说,存储列需要存储空间,就好像它是普通列—样。 虚拟类型是指在查询时临时派生的类型,不存储在数据库表中。MySQL 不存储标记为VIRTUAL的虚拟列。这意味着MySQL在需要时动态评估其值。BEFORE 这通常在触发任何查询后立即发生。换句话说,虚拟生成的列不占用存储空间。

主要包括:

        1. 表达式:使用各种函数或运算生成的字段,如 COUNT(), CONCAT(), YEAR() 等。

        2. 子查询:使用子查询生成的字段。

        3. UNION结果:使用 UNION 组合查询结果集时,临时生成的字段。

存储类型和虚拟类型的区别:   

  • 存储类型是实际存储的数据,虚拟类型是临时生成的。
  • 存储类型定义在表结构中,虚拟类型在查询时生成。
  • 存储类型可直接增删改,虚拟类型只读。
  • 存储类型可索引,虚拟类型不可索引。
  • 存储类型可控制空间,虚拟类型不占空间。

eg.现在我有一张表含有以下参数 name(姓名)  weight(体重)  height(身高),现在创建一个虚拟字段BMI 。(肥胖指数(BMI)=体重(kg)/( 身高 * 身高) (m)) 

MySQL的虚拟字段_第2张图片

创建表

CREATE TABLE person
(
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(20),
  weight DECIMAL(5,2), 
  height DECIMAL(3,2)
);

ALTER TABLE person 
ADD COLUMN BMI DECIMAL(5,2) GENERATED ALWAYS AS (weight / (height * height));

插入数据

INSERT INTO person (name, weight, height)
VALUES ('张三', 70, 1.70),  
       ('李四', 80, 1.80); 

结果:这里 他会根据公式自动计算BMI
        

缺点:在 MySQL 5.7 中,虚拟列(Generated Column)有一些限制,其中之一是不允许在虚拟列的表达式中使用某些函数。不同版本可能稍有误差

  • 1. 不能使用聚合函数如SUM、COUNT等
  • 2. 不能使用内置函数如CURRENT_USER()、LAST_INSERT_ID()等
  • 3. 也不能使用一些日期函数如CURDATE()、CURRENT_DATE()等

        

你可能感兴趣的:(mysql,数据库)