postgres 9.2中的ROWID等价物

时间:2013-01-31 13:05:25

标签: postgresql postgresql-9.2

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

在oracle中,我可以使用

SELECT MAX(BILLS.ROWID) FROM BILLS  

4 个答案:

答案 0 :(得分:12)

是的,ctid列与rowid相同。但对你来说没用。 Rowid和ctid是物理行/元组标识符=>重建/真空后可以改变。

请参阅:Chapter 5. Data Definition > 5.4. System Columns

答案 1 :(得分:2)

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;

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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