掌握mysql隐藏字段(rowid)什么时候是可见的

文 / @WordPress主题

掌握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就是隐式的。在设计数据库时,我们应该始终设定一个主键以保证数据的完整性。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。