postgres 9.2中的ROWID等价物

job*_*i88 16 postgresql postgresql-9.2

有没有办法在postgres中获得记录的rowid?

在oracle我可以使用喜欢

SELECT MAX(BILLS.ROWID) FROM BILLS  
Run Code Online (Sandbox Code Playgroud)

bak*_*048 14

是的,有ctid列,相当于rowid.但对你来说没用.Rowid和ctid是物理行/元组标识符=>可以在重建/真空后更改.

请参阅:第5章.数据定义> 5.4.系统专栏

  • ROWID绝对没有用武之地.因为它是行位置的物理标识符,所以对该行的访问速度最快(比PK查找快).通过转储ROWID然后将它们用作更新密钥,可以显着加快某些批处理操作.更有用的是,ROWID可以用于重复数据删除以在其他相同的行中进行选择,例如:从sometable中删除rowid不在(从某些表中选择min(rowid)一些,列,那应该是唯一的); ROWID和CTID随着时间的推移是可变的是有效的谨慎,但不会使它们"无用". (20认同)
  • @NoahYetter:公平地说:iddqd说"无用_给你_"(解决OP问题)我想他/她指的是jobi88假定rowid定义了某种行的顺序.对于找到"最新行",rowid肯定是"无用的" (7认同)
  • 我一直使用 ROWID,但仅在单个事务的上下文中使用。 (2认同)

Oli*_*row 8

PostgreSQL row_number() 窗口函数可用于大多数使用 rowid 的目的。在 Oracle 中 rowid 是结果数据行的固有编号,而在 Postgres row_number() 中计算返回数据的逻辑顺序内的编号。通常,如果您想对行进行编号,这意味着您希望它们按特定顺序排列,因此您可以在编号时指定哪些列对行进行排序:

select client_name, row_number() over (order by date) from bills;
Run Code Online (Sandbox Code Playgroud)

如果您只想对行进行任意编号,您可以将 over 子句留空:

select client_name, row_number() over () from bills;
Run Code Online (Sandbox Code Playgroud)

如果要计算行号的聚合,则必须使用子查询:

select max(rownum) from (
    select row_number() over () as rownum from bills
) r;
Run Code Online (Sandbox Code Playgroud)

如果您只需要表中的最后一项,并且有一列要按顺序排序,则有一种比使用 row_number() 更简单的方法。只需颠倒排序顺序并选择第一项:

select * from bills 
order by date desc limit 1;
Run Code Online (Sandbox Code Playgroud)

  • 我认为您将 rowid 与 rownum 混淆了。 (2认同)