### 26.4.29 信息\_SCHEMA INNODB\_虚拟表 [](<>) 这[`INNODB_VIRTUAL`](information-schema-innodb-virtual-table.html)表提供有关的元数据`InnoDB` [虚拟生成列](glossary.html#glos_virtual_generated_column)以及虚拟生成列所基于的列。 一行出现在[`INNODB_VIRTUAL`](information-schema-innodb-virtual-table.html)虚拟生成列所基于的每一列的表。 这[`INNODB_VIRTUAL`](information-schema-innodb-virtual-table.html)表有这些列: - `TABLE_ID` 表示与虚拟列关联的表的标识符;相同的值`INNODB_TABLES.TABLE_ID`. - `POS` 的位置值[虚拟生成列](glossary.html#glos_virtual_generated_column).该值很大,因为它对列序列号和序号位置进行了编码。用于计算该值的公式使用按位运算: ``` ((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开始计算。 - `基本位置` 虚拟生成的列所基于的列的顺序位置。 #### 实例 ``` 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 | +----------+-------+----------+ ``` #### 笔记 - 如果将常量值指定给[虚拟生成列](glossary.html#glos_virtual_generated_column),如下表所示,列的条目不会出现在`INNODB_虚拟`桌子要显示条目,虚拟生成的列必须具有基列。 ``` 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_列`](information-schema-innodb-columns-table.html)桌子 - 你一定有[`过程`](privileges-provided.html#priv_process)查询此表的权限。 - 使用`信息模式` [`柱`](information-schema-columns-table.html)桌子还是桌子[`显示列`](show-columns.html)语句以查看有关此表的列的其他信息,包括数据类型和默认值。