该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
语句查看有关此表的列的其他信息,包括数据类型和默认值。