25

有什么方法可以在 postgres 中获取记录的 rowid 吗?

在甲骨文我可以使用喜欢

SELECT MAX(BILLS.ROWID) FROM BILLS  
4

4 回答 4

21

是的,有与 rowid 等效的 ctid 列。但是对你没用。Rowid 和 ctid 是物理行/元组标识符 => 可以在重建/清理后更改。

请参阅:第 5 章。数据定义 > 5.4。系统列

于 2013-01-31T13:28:36.933 回答
8

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

select client_name, row_number() over (order by date) from bills;

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

select client_name, row_number() over () from bills;

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

select max(rownum) from (
    select row_number() over () as rownum from bills
) r;

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

select * from bills 
order by date desc limit 1;
于 2018-11-09T02:17:32.817 回答
0

使用序列。您可以选择 4 或 8 字节值。

http://www.neilconway.org/docs/sequences/

于 2013-04-13T08:44:14.567 回答
0

将任何唯一列添加到您的表中(名称可能为 rowid)。并通过创建 BEFORE UPDATE 触发器来防止更改它,如果有人尝试更新,它将引发异常。您可以使用@JohnMudd 提到的序列填充此列。

于 2017-04-13T12:30:33.143 回答