MySQL中的_rowid

lhrbest發表於2020-11-16

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), 學習最實用的資料庫技術。

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

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2734341/,如需轉載,請註明出處,否則將追究法律責任。

相關文章