在介绍mysql的多版本并发控制 MVCC 的过程中,我们提到过mysql中存在一些隐藏列,例如 行标识、 事务ID、 回滚指针等,不知道大家是否和我一样好奇过,要怎样才能实际地看到这些隐藏列的值呢?
本文我们就来重点讨论一下诸多隐藏列中的行标识 DB_ROW_ID ,实际上,将行标识称为隐藏 列并不准确,因为它并不是一个真实存在的列, DB_ROW_ID实际上是一个非空唯一列的 别名。在拨开它的神秘面纱之前,我们看一下官方文档的说明:
If a table has a PRIMARY KEY or UNIQUE NOT NULL index that consists of a single column that has an integer type, you can use _rowid to refer to the indexed column in SELECT statements
简单翻译一下,如果在表中存在主键或非空唯一索引,并且仅由一个整数类型的列构成,那么就可以使用 SELECT 语句直接查询 _rowid ,并且这个 _rowid 的值会引用该索引列的值。
着重看一下文档中提到的几个关键字, 主键、 唯一索引、 非空、 单独一列、 数值类型,接下来我们就要从这些角度入手,探究一下神秘的隐藏字段 _rowid 。
1、存在主键
先看设置了主键且是数值类型的情况,使用下面的语句建表:
CREATE TABLE `table1`(
`id` bigint( 20) NOT NULL PRIMARY KEY,
`name` varchar( 32) DEFAULT NULL
) ENGINE= InnoDB;
插入三条测试数据后,执行下面的查询语句,在 select 查询语句中直接查询 _rowid :
select*,_rowid fromtable1
查看执行结果, _rowid 可以被正常查询:
可以看到在设置了主键,并且主键字段是数值类型的情况下, _rowid 直接引用了主键字段的值。对于这种可以被 select 语句查询到的的情况,可以将其称为 显式的 rowid 。
回顾一下前面提到的文档中的几个关键字,再考虑其他情况。由于主键必定是非空字段,下面来看一下主键是非数值类型字段的情况,建表如下:
CREATE TABLE `table2`(
`id` varchar( 20) NOT NULL PRIMARY KEY,
`name` varchar( 32) DEFAULT NULL
) ENGINE= InnoDB;
在 table2 执行上面相同的查询,结果报错无法查询 _rowid ,也就证明了如果主键字段是非数值类型,那么将无法直接查询 _rowid 。
2、无主键,存在唯一索引
上面对两种类型的主键进行了测试后,接下来我们看一下当表中没有主键、但存在唯一索引的情况。首先测试非空唯一索引加在数值类型字段的情况,建表如下:
CREATETABLE`table3`(
`id` bigint( 20) NOT