有没有办法在postgres中获取记录的rowid?
在oracle中,我可以使用
SELECT MAX(BILLS.ROWID) FROM BILLS
答案 0 :(得分:12)
是的,ctid列与rowid相同。但对你来说没用。 Rowid和ctid是物理行/元组标识符=>重建/真空后可以改变。
答案 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个字节的值。
答案 3 :(得分:0)
向表中添加任何唯一列(名称可能是rowid)。 并防止通过创建BEFORE UPDATE触发器来更改它,如果有人尝试更新,则会引发异常。 您可以使用@JohnMudd提及的序列填充此列。