凯发真人娱乐

postgresql有rowid函数吗 -凯发真人娱乐

2023-06-28

小编给大家分享一下postgresql有rowid函数吗,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

oracle中可以通过rowid定位到一条数据。索引扫描就是先根据查询条件的到对应数据的rowid,然后通过rowid得到数据,也可以直接使用rowid来查询数据,比如select * from tbl where rowid=xxx; 在没有行迁移的情况下,rowid是固定不变的。

在pg中索引扫描是先查询到数据的ctid,然后根据ctid去得到相应的数据。但是ctid和oracle中的rowid并不完全相同,因为pg中多版本的原因,ctid是会发生变化的,例如:

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中如何实现类似rowid类似的功能呢?

—方法一:sequence 唯一标识

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)

不过oid不适合存储超过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)

不过需要注意的是,在pg12中已经不支持create table xxx with oids这种语法了。

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作为一种数据类型来使用:

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

看完了这篇文章,相信你对postgresql有rowid函数吗有了一定的了解,想了解更多相关知识,欢迎关注本站行业资讯频道,感谢各位的阅读!

网站地图