MySQL中的_rowid
MySQL中的_rowid
前言
在
Oracle
資料庫的表中的每一行資料都有一個唯一的識別符號,稱為
rowid
,在
Oracle
內部通常就是使用它來訪問資料的。
而在
MySQL
中也有一個類似的隱藏列
_rowid
來標記唯一的標識。但是需要注意
_rowid
並不是一個真實存在的列,其本質是一個
非空唯一列的別名。
PS:本文是基於
MySQL 5.7
進行研究的
_rowid到底是什麼
在前文提到了
_rowid
並不是一個真實存在的列,其本質是一個
非空唯一列的別名。為什麼會這麼說呢?
因為在某些情況下
_rowid
是不存在的,其只存在於以下情況:
- 當表中存在一個
數字型別的
單列
主鍵時,
_rowid
其實就是指的是這個主鍵列 -
當表中 不存在主鍵但存在一個 數字型別的 非空 唯一索引時,
_rowid
其實就是指的是對應 非空唯一列。
需要注意以下情況是不存在
_rowid
的
- 主鍵列或者 非空唯一列的型別不是 數字型別
- 主鍵是聯合主鍵
-
唯一列不是非空的。
詳情可以參考
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.
參考資料
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月 ● 版權所有,歡迎分享本文,轉載請保留出處 ........................................................................................................................ ● 小麥苗的微店: ● 小麥苗出版的資料庫類叢書: 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中rowid的用法Oracle
- 【oracle中rowid的用法】Oracle
- 淺談Rowid中的行號
- oracle中的Rowid和UrowidOracle
- mysql 5.7 _rowid虛列之一MySql
- oracle中rownum和rowid的區別Oracle
- oracle 表中的rowid是什麼意思Oracle
- 請教關於mysql有沒有rowid?MySql
- SQLite資料庫中rowid使用SQLite資料庫
- 【ROWID】Oracle rowid說明Oracle
- Oracle中rownum與rowid使用上的問題Oracle
- insert操作放在undo中的rowid怎麼來的!
- oracle rowid 的含義Oracle
- oracle rowidOracle
- dbms_rowid之dbms_rowid.rowid_info儲存過程使用(in out)儲存過程
- 關於rowid的應用
- rowid和rownum的區別
- rowid的一點總結!
- ROWID簡介
- ROWID詳解
- ORACLE ROWID (zt)Oracle
- Oracle中的ROWID實現(r10筆記第95天)Oracle筆記
- 轉---DBMS_ROWID.ROWID_CREATE來解決壞塊
- 【MySQL】MySQL中的鎖MySql
- oracle8的ROWID結構Oracle
- oracle常用包之dbms_rowid oracle rowid含義分析Oracle
- oracle rowid詳解Oracle
- Oracle rowid 詳解Oracle
- Oracle ROWID-1Oracle
- Oracle ROWID-2Oracle
- oracle rowid (轉載)Oracle
- 【丁原】分頁sql中普通寫法和rowid寫法的效能比較SQL
- oracle壞塊的rowid方式修復Oracle
- ROWID的結構與組成 zt
- oracle8的ROWID結構(轉)Oracle
- index和rowid的一點關係!Index
- rowid一點總結
- Datatypes (1) : ROWID and UROWID