MySQL 8.3 Release Notes
该 INNODB_VIRTUAL
表提供了关于 InnoDB
虚拟生成列 和基于虚拟生成列的列的元数据。
对于基于虚拟生成列的每个列,INNODB_VIRTUAL
表中都会出现一行。
该 INNODB_VIRTUAL
表具有以下列:
-
TABLE_ID
表示与虚拟列关联的表的标识符;与
INNODB_TABLES.TABLE_ID
相同。 -
POS
虚拟生成列的位置值。该值很大,因为它编码了列序号和顺序位置。计算该值的公式使用位运算:
((nth virtual generated column for the InnoDB instance + 1) << 16) + the ordinal position of the virtual generated column
例如,如果
InnoDB
实例中的第一个虚拟生成列是表的第三列,则公式为(0 + 1) << 16) + 2
。InnoDB
实例中的第一个虚拟生成列总是编号为 0。作为表的第三列,虚拟生成列的顺序位置是 2。顺序位置从 0 开始计数。 -
BASE_POS
基于虚拟生成列的列的顺序位置。
示例
mysql> CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) GENERATED ALWAYS AS (a+b) VIRTUAL,
`h` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_VIRTUAL
WHERE TABLE_ID IN
(SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES
WHERE NAME LIKE "test/t1");
+----------+-------+----------+
| TABLE_ID | POS | BASE_POS |
+----------+-------+----------+
| 98 | 65538 | 0 |
| 98 | 65538 | 1 |
+----------+-------+----------+
注意事项
-
如果将常量值分配给 虚拟生成列,例如以下表所示,则该列在
INNODB_VIRTUAL
表中不会出现条目。要出现条目,虚拟生成列必须有基础列。CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) GENERATED ALWAYS AS (5) VIRTUAL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
然而,这样的列的元数据将出现在
INNODB_COLUMNS
表中。 -
您必须拥有
PROCESS
权限才能查询该表。 -
使用
INFORMATION_SCHEMA
COLUMNS
表或SHOW COLUMNS
语句来查看该表的列的更多信息,包括数据类型和默认值。