溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

postgresql有rowid函數(shù)嗎

發(fā)布時(shí)間:2020-07-31 11:10:35 來(lái)源:億速云 閱讀:214 作者:清晨 欄目:編程語(yǔ)言

小編給大家分享一下postgresql有rowid函數(shù)嗎,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

oracle中可以通過(guò)rowid定位到一條數(shù)據(jù)。索引掃描就是先根據(jù)查詢條件的到對(duì)應(yīng)數(shù)據(jù)的rowid,然后通過(guò)rowid得到數(shù)據(jù),也可以直接使用rowid來(lái)查詢數(shù)據(jù),比如select * from tbl where rowid=xxx; 在沒(méi)有行遷移的情況下,rowid是固定不變的。

在pg中索引掃描是先查詢到數(shù)據(jù)的ctid,然后根據(jù)ctid去得到相應(yīng)的數(shù)據(jù)。但是ctid和oracle中的rowid并不完全相同,因?yàn)閜g中多版本的原因,ctid是會(huì)發(fā)生變化的,例如:

bill=# select ctid,* from t1 limit 5;
 ctid | id 
--------+----
 (0,1) | 1
 (0,2) | 2
 (0,3) | 3
 (0,4) | 4
 (0,5) | 5
(5 rows)
bill=# update t1 set id=111 where id =1;
UPDATE 1
bill=# vacuum ANALYZE t1;
VACUUM
bill=# select ctid,* from t1 limit 5;   
 ctid | id 
--------+----
 (0,2) | 2
 (0,3) | 3
 (0,4) | 4
 (0,5) | 5
 (0,6) | 6
(5 rows)

那在pg中如何實(shí)現(xiàn)類似rowid類似的功能呢?

—方法一:sequence 唯一標(biāo)識(shí)

bill=# create table tbl (rowid serial8 not null, c1 int, c2 int);  
CREATE TABLE
bill=# create unique index idx_tbl_1 on tbl(rowid);  
CREATE INDEX
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# select * from tbl;
rowid | c1 | c2 
------+----+----
   1 |  1 | 2
   2 |  1 | 2
   3 |  1 | 2
(3 rows)

—方法二:identify列

bill=# create table tbl (rowid int8 GENERATED ALWAYS AS IDENTITY not null, c1 int, c2 int);  
create unique index idx_tbl_1 on tbl(rowid);  CREATE TABLE
bill=# create unique index idx_tbl_1 on tbl(rowid);  
CREATE INDEX
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# insert into tbl (c1,c2) values (1,2);  
INSERT 0 1
bill=# select * from tbl;  
rowid | c1 | c2 
------+----+----
  1  | 1 |  2
  2  |  1 | 2
  3  | 1 | 2
(3 rows)

—方法三:oid

bill=# /dT oid
              List of data types
Schema   | Name |  Description                
-----------+------+-------------------------------------------
pg_catalog | oid |  object identifier(oid), maximum 4 billion
(1 row)

不過(guò)oid不適合存儲(chǔ)超過(guò)40億條記錄的表。

postgres=# create table tbl (c1 int, c2 int) with oids;  
CREATE TABLE
postgres=# create unique index idx_tbl_oid on tbl(oid); 
CREATE INDEX
postgres=# insert into tbl (c1,c2) values (1,2);  
INSERT 168528 1
postgres=# insert into tbl (c1,c2) values (1,2);  
INSERT 168529 1
postgres=# insert into tbl (c1,c2) values (1,2);  
INSERT 168530 1
postgres=# select oid,* from tbl;  
oid    | c1 | c2 
--------+----+----
168528  | 1 | 2
168529  | 1 | 2
168530  | 1 | 2
(3 rows)

不過(guò)需要注意的是,在pg12中已經(jīng)不支持create table xxx with oids這種語(yǔ)法了。

bill=# create table tbl (c1 int, c2 int) with oids; 
psql: ERROR:  syntax error at or near "oids"
LINE 1: create table tbl (c1 int, c2 int) with oids;

pg12中是將oid作為一種數(shù)據(jù)類型來(lái)使用:

postgresql有rowid函數(shù)嗎

bill=# create table tbl(oid oid,c1 int,c2 int);
CREATE TABLE

看完了這篇文章,相信你對(duì)postgresql有rowid函數(shù)嗎有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

gr st
AI