• 技术文章 >数据库 >PostgreSQL

    postgresql有rowid吗

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-12-25 15:17:59原创7864

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

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    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 唯一标识

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    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列

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    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

    1

    2

    3

    4

    5

    6

    bill=# /dT oid

                  List of data types

    Schema   | Name |  Description               

    -----------+------+-------------------------------------------

    pg_catalog | oid |  object identifier(oid), maximum 4 billion

    (1 row)

    不过oid不适合存储超过40亿条记录的表。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    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这种语法了。

    1

    2

    3

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

    d547fe2e9793aa4530fb05ebdaf5b6b.png

    1

    2

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

    CREATE TABLE

    Python学习网,大量的免费PostgreSQL入门教程,欢迎在线学习!

    专题推荐:postgresql rowid
    上一篇:kettle postgresql 乱码怎么解决 下一篇:postgresql安装详细步骤

    相关文章推荐

    • postgresql oid是什么• postgresql cast是什么

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网