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月 ● 版權所有,歡迎分享本文,轉載請保留出處 ........................................................................................................................ ● 小麥苗的微店: 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 5.7 _rowid虛列之一MySql
- 淺談Rowid中的行號
- 【ROWID】Oracle rowid說明Oracle
- oracle rowid詳解Oracle
- Oracle redo解析之-4、rowid的計算Oracle Redo
- [20191011]拆分rowid 2.txt
- [20191012]組成rowid.txt
- 基於ROWID更新的物化檢視測試
- 0317TABLE ACCESS BY INDEX ROWID BATCHEDIndexBAT
- 【TUNE_ORACLE】ROWID切片SQL參考OracleSQL
- 【MySQL】MySQL中的鎖MySql
- 317TABLE ACCESS BY INDEX ROWID BATCHED2IndexBAT
- 317TABLE ACCESS BY INDEX ROWID BATCHED3IndexBAT
- 【MySQL】MySQL中的鎖機制MySql
- Extract rows from a CORRUPT table creating ROWID from DBA_EXTENTS
- mysql中的xaMySql
- MySQL中的排序MySql排序
- MySql(三) MySql中的鎖機制MySql
- (14)mysql 中的事件MySql事件
- MYSQL中replace into的用法MySql
- MySQL中limit的用法MySqlMIT
- MySQL中的自增列MySql
- MySQL中的Statistics等待MySql
- MySQL中的source命令MySql
- MYSQL中的那些鎖MySql
- MySQL 中的 EXPLAIN 命令MySqlAI
- Mysql中的小技巧MySql
- mySQL中replace的用法MySql
- MySQL中的IO流MySql
- 【MySQL】七、再說MySQL中的 table_idMySql
- (12)mysql 中的游標MySql
- django 中 mysql 的 charset 配置DjangoMySql
- mysql中!=和is not的區別MySql
- mysql中case when的使用MySql
- MySQL中的索引詳講MySql索引
- Mysql中的DQL語句MySql
- MySQL中的@變數名MySql變數
- MariaDB/MySQL中的變數MySql變數