24.32.25 INFORMATION_SCHEMA INNODB_SYS_VIRTUALtable

INNODB_SYS_VIRTUALtable 提供有关InnoDB 虚拟生成的列以及虚拟生成的列所基于的列的元数据,等效于InnoDB数据字典中SYS_VIRTUALtable 中的信息。

INNODB_SYS_VIRTUALtable 中的每一行都会出现一行,虚拟生成的列所基于的每一列。

INNODB_SYS_VIRTUALtable 具有以下列:

  • TABLE_ID

代 table 与虚拟列关联的 table 的标识符;与INNODB_SYS_TABLES.TABLE_ID相同的值。

  • POS

虚拟生成的列的位置值。该值很大,因为它会编码列序列号和 Sequences 位置。用于计算值的公式使用按位运算:

((nth virtual generated column for the InnoDB instance + 1) << 16)
+ the ordinal position of the virtual generated column

例如,如果InnoDB实例中的第一虚拟生成列是 table 的第三列,则公式为(0 + 1) << 16) + 2InnoDB实例中的第一个虚拟生成的列始终为数字 0.作为 table 中的第三列,虚拟生成的列的 Sequences 位置为 2.Sequences 位置从 0 开始计数。

  • BASE_POS

虚拟生成的列所基于的列的 Sequences 位置。

Example

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 |
+----------+-------+----------+
|       95 | 65538 |        0 |
|       95 | 65538 |        1 |
+----------+-------+----------+

Notes

  • 如果将常量值分配给虚拟生成的列,如下 table 所示,则该列的条目不会出现在INNODB_SYS_VIRTUALtable 中。要显示条目,虚拟生成的列必须具有基本列。
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_SYS_COLUMNStable 中。

  • 您必须具有PROCESS特权才能查询此 table。

  • 使用INFORMATION_SCHEMA COLUMNStable 或SHOW COLUMNS语句查看有关此 table 列的其他信息,包括数据类型和默认值。