Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  The INFORMATION_SCHEMA INNODB_VIRTUAL Table

28.4.29 INFORMATION_SCHEMA INNODB_VIRTUAL 表

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