MySQL中的_rowid

MySQL中的_rowid



前言

Oracle数据库的表中的每一行数据都有一个唯一的标识符,称为 rowid,在 Oracle内部通常就是使用它来访问数据的。

而在 MySQL中也有一个类似的隐藏列 _rowid来标记唯一的标识。但是需要注意 _rowid并不是一个真实存在的列,其本质是一个 非空唯一列的别名。

PS:本文是基于 MySQL 5.7进行研究的

_rowid到底是什么

在前文提到了 _rowid并不是一个真实存在的列,其本质是一个 非空唯一列的别名。为什么会这么说呢?

因为在某些情况下 _rowid是不存在的,其只存在于以下情况:

  1. 当表中存在一个 数字类型 单列 主键时, _rowid其实就是指的是这个主键列
  2. 当表中 不存在主键但存在一个 数字类型非空 唯一索引时, _rowid其实就是指的是对应 非空唯一列


需要注意以下情况是不存在 _rowid

  1. 主键列或者 非空唯一列的类型不是 数字类型
  2. 主键是联合主键
  3. 唯一列不是非空的。


详情可以参考 MySQL 官方文档内容:

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, as follows:

  • _rowid refers to the PRIMARY KEY column if there is a PRIMARY KEY consisting of a single integer column. If there is a PRIMARY KEY but it does not consist of a single integer column,  _rowid cannot be used.
  • Otherwise,  _rowid refers to the column in the first UNIQUE NOT NULL index if that index consists of a single integer column. If the first UNIQUE NOT NULL index does not consist of a single integer column,  _rowid cannot be used.

参考资料

  1. 13.1.14 CREATE INDEX Syntax
  2. Re: Oracle ROWID equivalent in MySQL


create table t_rowid(a int primary key,b int);
insert into t_rowid values (1,1),(2,2);
MySQL [lhrdb]> select _rowid from t_rowid;
+--------+
| _rowid |
+--------+
|      1 |
|      2 |
+--------+
2 rows in set (0.00 sec)
MySQL [lhrdb]> select  _rowid,a from t_rowid;
+--------+---+
| _rowid | a |
+--------+---+
|      1 | 1 |
|      2 | 2 |
+--------+---+
2 rows in set (0.00 sec)
MySQL [lhrdb]> select r._rowid ,(@rownum:=@rownum+1) as rn,a,b from t_rowid r,(select @rownum:=0) as rn;
+--------+------+---+------+
| _rowid | rn   | a | b    |
+--------+------+---+------+
|      1 |    1 | 1 |    1 |
|      2 |    2 | 2 |    2 |
+--------+------+---+------+
2 rows in set (0.00 sec)




MySQL Key值(PRI, UNI, MUL)的含义

PRI主键约束;

UNI唯一约束;

MUL可以重复。

注:若是普通的key或者普通的index(实际上,普通的key与普通的index同义)。


当我们在desc 表名; 的时候,有一个Key值,表示该列是否含有索引
假设表结构如下所示
mysql> desc aa;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
| xx    | int(11) | YES  | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
| yy    | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
| zz    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

我们看到Key那一栏,可能会有4种值,即'啥也没有','PRI','UNI','MUL'
1. 如果Key是空的, 那么该列值的可以重复,表示 该列没有索引, 或者是一个 非唯一的复合索引的 前导列
2. 如果Key是PRI,  那么该列是主键的组成部分
3. 如果Key是UNI,  那么该列是一个 唯一值索引的第一列(前导列),且 不能含有空值(NULL)
4. 如果Key是MUL,  那么该列的值可以重复, 该列是一个 非唯一索引的前导列(第一列)或者是一个 唯一性索引的组成部分但是 可以含有空值NULL

注:
1、如果对于一个列的定义,同时满足上述4种情况的多种,比如一个列既是PRI,又是UNI(如果是PRI,则一定是UNI)
那么"desc 表名"; 的时候,显示的Key值按照优先级来显示  PRI->UNI->MUL
那么此时,显示PRI。

2、如果某列不能含有空值,同时该表没有主键,则一个唯一性索引列可以显示为PRI,

3、如果多列构成了一个唯一性复合索引,那么一个唯一性索引列可以显示为MUL。(因为虽然索引的多列组合是唯一的,比如ID+NAME是唯一的,但是每一个单独的列依然可以有重复的值,因为只要ID+NAME是唯一的即可)







About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在个人微 信公众号( DB宝)上有同步更新

● QQ群号: 230161599 、618766405,微信群私聊

● 个人QQ号(646634621),微 信号(db_bao),注明添加缘由

● 于 2020年11月完成

● 最新修改时间:2020年11月

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

● 小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用、DBA学习班http://blog.itpub.net/26736162/viewspace-2148098/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

........................................................................................................................

请扫描下面的二维码来关注小麦苗的微 信公众号( DB宝)及QQ群(230161599、618766405)、添加小麦苗微 信(db_bao), 学习最实用的数据库技术。

........................................................................................................................

 

 



请使用浏览器的分享功能分享到微信等