MySQL中的隐藏列!_rowid

在介绍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 可以被正常查询:

img

可以看到在设置了主键,并且主键字段是数值类型的情况下, _rowid 直接引用了主键字段的值。对于这种可以被 select 语句查询到的的情况,可以将其称为 显式的 rowid 。

回顾一下前面提到的文档中的几个关键字,再考虑其他情况。由于主键必定是非空字段,下面来看一下主键是非数值类型字段的情况,建表如下:

CREATE TABLE `table2`(
`id` varchar( 20) NOT NULL PRIMARY KEY,
`name` varchar( 32) DEFAULT NULL
) ENGINE= InnoDB;

在 table2 执行上面相同的查询,结果报错无法查询 _rowid ,也就证明了如果主键字段是非数值类型,那么将无法直接查询 _rowid 。

img

2、无主键,存在唯一索引

上面对两种类型的主键进行了测试后,接下来我们看一下当表中没有主键、但存在唯一索引的情况。首先测试非空唯一索引加在数值类型字段的情况,建表如下:

CREATETABLE`table3`(
`id` bigint( 20) NOT 
  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值