Postgresql 博士后9.2中的ROWID当量

Postgresql 博士后9.2中的ROWID当量,postgresql,postgresql-9.2,Postgresql,Postgresql 9.2,有没有办法在博士后中获得一项记录 在oracle中,我可以使用 SELECT MAX(BILLS.ROWID) FROM BILLS 是的,有一个ctid列,它相当于rowid。但对你来说没用。Rowid和ctid是物理行/元组标识符=>可以在重建/真空后更改 请参阅:使用序列。您可以选择4或8字节值 将任何唯一列添加到tablename(可能是rowid)中。 并通过创建“更新前”触发器来防止更改,如果有人试图更新,该触发器将引发异常。 您可以使用前面提到的@JohnMudd序列填充此列

有没有办法在博士后中获得一项记录

在oracle中,我可以使用

SELECT MAX(BILLS.ROWID) FROM BILLS  

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


请参阅:

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


将任何唯一列添加到tablename(可能是rowid)中。 并通过创建“更新前”触发器来防止更改,如果有人试图更新,该触发器将引发异常。
您可以使用前面提到的@JohnMudd序列填充此列。

PostgreSQL行号窗口函数可用于大多数使用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;

很抱歉,oracle ROWID没有提供行号。此ROWID的用途是什么?我需要获取表中最新的rowlast记录。为此,我使用了子查询,如SELECT*FROM BILLS,其中ROWID=SELECT MAXBILLS.ROWID FROM BILLS ROWID最高的行不是我重复,不保证是最新的行。这是一个完全错误的假设。罗维德肯定不是无用的。因为它是行位置的物理标识符,所以它比PK查找更快地访问该行。通过转储rowid然后将其用作更新键,可以显著加快某些批处理操作。更有用的是,ROWID可用于重复数据消除删除,以便在其他相同的行中进行选择,例如:从某个表中删除,其中ROWID不在select minrowid from sometable group by some,columns中,这应该是唯一的;ROWID和CTID随着时间的推移是可变的,这是一个有效的警告,但并不意味着它们无用。我一直在使用ROWID,但只在单个事务的上下文中使用。@Noahyter:公平地说:iddqd对您处理OP来说是无用的,我猜他/她指的是这样一个事实,即jobi88假设ROWID定义了事务的某种顺序排。rowid对于查找最新的rowid毫无用处。我想你把rowid和rownum搞混了。你是对的。要澄清的是,在Oracle中,rowid是行的物理位置。它与插入顺序无关,不能用于标识最近插入的记录。PostgreSQL中最接近的等价项是ctid。在Oracle中,rownum是行在结果集中的位置,可以在PostgreSQL中使用我描述的row_number函数进行模拟。如果您希望在postgres中根据顺序条件对行进行编号,这是正确的答案。看到和