postgres 9.2 中的 ROWID 等效项

Posted

技术标签:

【中文标题】postgres 9.2 中的 ROWID 等效项【英文标题】:ROWID equivalent in postgres 9.2 【发布时间】:2013-01-31 13:05:24 【问题描述】:

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

在 oracle 中我可以像这样使用

SELECT MAX(BILLS.ROWID) FROM BILLS  

【问题讨论】:

对不起,oracle ROWID 没有给你行号。 这个ROWID的目的是什么? 我需要获取表格中的最新行(最后一条记录)。为此,我正在使用子查询,例如 SELECT * FROM BILLS WHERE ROWID=(SELECT MAX(BILLS.ROWID) FROM BILLS) 具有最高 rowid 的行是 NOT(我重复 NOT)保证是“最新”行。这是一个完全错误的假设。 【参考方案1】:

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

见:Chapter 5. Data Definition > 5.4. System Columns

【讨论】:

ROWID 肯定不是没用的。因为它是行位置的物理标识符,所以它是对该行的最快访问(比 PK 查找更快)。通过转储 ROWID 然后将它们用作更新键,可以显着加快某些批处理操作。更有用的是,ROWID 可用于重复数据删除以在其他相同的行中进行选择,例如:从 sometable 中删除 rowid 不在 (select min(rowid) from sometable group by some, columns, that, should, be, unique ); ROWID 和 CTID 随着时间的推移是可变的,这是一个有效的警告,但不会使它们“无用”。 我一直使用 ROWID,但只在单个事务的上下文中使用。 @NoahYetter:公平地说:iddqd 说“对你没用 ”(针对 OP),我猜他/她指的是 jobi88 假设rowid 定义了某种行的顺序。 rowid 对于查找“最新行”肯定是“无用的”【参考方案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;

【讨论】:

我认为您将 rowid 与 rownum 混淆了。 你是对的。澄清一下,在 Oracle 中,rowid 是行的物理位置。它与插入顺序无关,不能用于标识最近插入的记录。 PostgreSQL 中最接近的等价物是 ctid。在 Oracle 中,rownum 是结果集中行的位置,可以在 PostgreSQL 中使用我描述的 row_number() 函数来模拟。 如果您想根据订单条件在 postgres 中对行进行编号,这是正确的答案。见***.com/questions/7747327/sql-rank-versus-row-number 和postgresql.org/docs/12/functions-window.html【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于postgres 9.2 中的 ROWID 等效项的主要内容,如果未能解决你的问题,请参考以下文章

此 SQL 的 Cosmos DB 等效项

Postgres 9.2 - 添加条件约束检查

Postgres 9.2 PL/pgSQL 循环简单更新

Sitecore 8.1 rev 的 Sitecore 9.2 (002893) 等效 DLL。 151207

Postgres中'money'和'OID'的sqlalchemy等效列类型是啥?

TypeScript 中的 querySelectorAll 等效项