眼见为实,来瞧瞧MySQL中的隐藏列!

news/2024/11/23 3:30:58/

在介绍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 from table1

查看执行结果,_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、无主键,存在唯一索引
上面对两种类型的主键进行了测试后,接下来我们看一下当表中没有主键、但存在唯一索引的情况。首先测试非空唯一索引加在数值类型字段的情况,建表如下:

CREATE TABLE `table3` (`id` bigint(20) NOT NULL UNIQUE KEY,`name` varchar(32)
) ENGINE=InnoDB;

查询可以正常执行,并且_rowid引用了唯一索引所在列的值:
在这里插入图片描述
唯一索引与主键不同的是,唯一索引所在的字段可以为NULL。在上面的table3中,在唯一索引所在的列上添加了NOT NULL非空约束,如果我们把这个非空约束删除掉,还能显式地查询到_rowid吗?下面再创建一个表,不同是在唯一索引所在的列上,不添加非空约束:

CREATE TABLE `table4` (`id` bigint(20) UNIQUE KEY,`name` varchar(32)
) ENGINE=InnoDB;

执行查询语句,在这种情况下,无法显式地查询到_rowid:
在这里插入图片描述

和主键类似的,我们再对唯一索引被加在非数值类型的字段的情况进行测试。下面在建表时将唯一索引添加在字符类型的字段上,并添加非空约束:

CREATE TABLE `table5` (`id` bigint(20),`name` varchar(32) NOT NULL UNIQUE KEY
) ENGINE=InnoDB;

同样无法显示。
针对上面三种情况的测试结果,可以得出结论,当没有主键、但存在唯一索引的情况下,只有该唯一索引被添加在数值类型的字段上,且该字段添加了非空约束时,才能够显式地查询到_rowid,并且_rowid引用了这个唯一索引字段的值。


http://www.ppmy.cn/news/59876.html

相关文章

Windows上使用CLion配置OpenCV环境,CMake下载,OpenCV的编译,亲测可用的方法(一)

一、Windows上使用CLion配置OpenCV环境,亲测可用的方法: Windows上使用CLion配置OpenCV环境 教程里的配置: widnows 10 clion 2022.1.1 mingw 8.1.0 opencv 4.5.5 Cmake3.21.1 我自己的配置: widnows 10 clion 2022.2.5 mingw 8.1.0 https://sourceforge.net/projects/min…

11. Kubernetes 开章

本章讲解知识点 Kubernetes 概念为什么要使用 KubernetesKubernetes 的部署架构Kubernetes 基本命令本章主要是针对 Kubernetes 基本概念为读者讲解,读者能有一个大概印象即可,不需要过于斟酌细节,针对 Kubernetes 的概念将在后面章节中详细讲解。 1. Kubernetes 概念 我们…

今天来聊一聊京东服务接口的高可用设计

前言 到底啥是高可用 为啥做高可用 高可用的关键点 接口高可用设计的几个原则 1、控制依赖 2、避免单点 3、负载均衡 4、资源隔离 5、接口限流 6、服务熔断 7、异步处理 8、降级方案 9、灰度发布 10、混沌工程 前言 作为一个后端研发人员,开发服务接…

让Linux中的SCP远程复制不再需要输入密码

SCP是Secure Copy的缩写,SCP是Linux系统下基于SSH登陆进行安全的远程文件拷贝命令。Linux的scp命令可以在Linux服务器之间复制文件和目录。 让SCP不再需要输入密码,以便我们在Shell中方便调用,下面介绍一下配置方法: 生成密匙对…

手残也不该敲的命令

Linux命令是一种很有趣且有用的东西,但在你不知道会带来什么后果的时候,它又会显得非常危险。所以,在输入某些命令前,请多多检查再敲回车。 rm –rf rm –rf是删除文件夹和里面附带内容的一种最快捷的方法,但是细微的…

第一次使用服务器部署项目

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

《基于改进YOLOv5的无人机图像检测算法》论文阅读

原文链接:UAV Recognition and Tracking Method Based on YOLOv5 | IEEE Conference Publication | IEEE Xplore 《基于改进YOLOv5的无人机图像检测算法》论文阅读 基于深度学习的目标检测算法通常对传统目标检测效果较好,但对小目标的检测精度较低。针…

JavaWeb ( 一 ) HTTP协议

1.http协议 1.0.Web Web指的是World Wide Web,也称为万维网,是一种基于互联网的信息系统,由全球数百万个网站组成。它允许用户通过使用网页浏览器访问和交互信息,例如阅读新闻、购物、发送和接收电子邮件、社交媒体等。 Web使用…