掌握mysql隐藏字段(rowid)什么时候是可见的
掌握MySQL隐藏字段(rowid)什么时候是可见的
MySQL中有一个隐藏字段叫做rowid,它会在创建表时自动存在,但是只有在特定情况下才会被显示出来。在本文中,我们将探讨rowid何时可见以及如何理解它。
什么是rowid?
类似于其他关系型数据库,MySQL中的每一行数据都有一个唯一的标识符,这个标识符就是rowid。rowid不是由用户指定的,它是由MySQL自动创建的,每当新的一行数据被插入到表中时,MySQL会自动为它生成一个唯一的rowid。
何时rowid可见?
但是,rowid并不总是可见的。在MySQL中,只有在特定情况下,rowid才会被显示出来。下面是rowid可见的两种情况:
1. 表中有主键并且是数值型的时候,rowid是可见的;
2. 表中没有主键,但是有唯一非空并且是数值型的字段时,rowid是可见的。
如果上述条件都不成立,rowid将是隐式的。
实战验证rowid是否可见
我们可以通过创建不同类型的表来验证rowid是否可见。下面是我们创建了五个不同类型的表:
1. 创建一个带有数值型主键的表:
CREATE TABLE z1 (
id bigint(20) primary key
) engine=innodb;
2. 创建一个带有非数值型主键的表:
CREATE TABLE z2 (
name varchar(20) primary key
) engine=innodb;
3. 创建一个没有主键但有唯一非空数值型字段的表:
CREATE TABLE z3 (
name int(11) not null,
unique (name)
) engine=innodb charset=utf8;
4. 创建一个没有主键且唯一字段可以为空或不是数值型的表:
CREATE TABLE z4 (
name varchar(11) not null,
unique (name)
) engine=innodb charset=utf8;
CREATE TABLE z5 (
name int(11),
unique (name)
) engine=innodb charset=utf8;
根据MySQL官网的文档,我们知道了在什么情况下rowid是可见的。但是,仅仅是知道这些还不够。为了更好地理解rowid,我们需要深入探讨。
如果表中存在一个主键或唯一非空数值型字段的话,rowid将指向这个字段。如果均不存在,rowid的指向就会变得比较难以确定。在这种情况下,MySQL会自动选择第一个唯一非空索引字段,如果该字段是数值型的话,rowid就会指向这个字段;否则,rowid依然是隐式的。
现在,我们来看一个实际的案例:如何使rowid达到最大值,以及达到最大值后会发生什么?
首先,我们需要创建一张只有一个字符串类型字段的表:
CREATE TABLE z6 (
name varchar(255)
) engine=innodb charset=utf8;
接着,我们通过gdb工具调整rowid的值:
利用ps命令查找mysqld进程的pid:
ps aux | grep mysqld
使用gdb工具让rowid达到最大值:
gdb -p [你的mysql的pid] -ex 'dict_sys->row_id=1' -batch
在达到最大值后,我们尝试插入三行数据:
INSERT INTO z6 (name) values ('a1'), ('a2'), ('a3');
此时,我们会发现,只有a3被成功存储了。为什么会这样呢?这是因为rowid的唯一值被耗尽并进入回绕模式,导致a1和a2被覆盖。因此,我们应该始终为表设定一个主键以保证数据的完整性。
总结:
在MySQL中,rowid是用于标识每一行数据的唯一值。rowid只有在特定情况下才会被显示出来,当表中存在数值型主键或唯一非空数值型字段时,rowid才会被显示出来。当不存在这些情况时,rowid就是隐式的。在设计数据库时,我们应该始终设定一个主键以保证数据的完整性。

-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql怎么替换部分字符串 2023-05-14 07:00:02
-
delete和drop的区别是什么 2023-05-14 07:00:02
-
mysql 中文乱码解决办法 2023-05-14 07:00:02