如何在Oracle中检索最后插入的记录

3

请提供数据表结构,您的数据表中是否有ID字段或者在记录添加时会自动添加的日期时间字段? - Taryn
“Details”是什么意思?这只是一个一般的“给我最近的记录”吗?还是您想知道插入点处默认或派生值的值? - APC
2个回答

8
insert into mytable (...) values (...)
returning id into v_id;

2
жИСиЃ§дЄЇдљ†еЇФиѓ•дљњзФ®.CURRVALжЭ•иОЈеПЦеЇПеИЧеАЉгАВ - Guillaume Poussel
答案和评论仅在插入会话中有效,而我认为这不是原始问题的意图。(尽管这部分基于“详细信息”的复数形式,并没有明确要求ID,所以准备好被证明错误!) - Alex Poole
@GuillaumePoussel - CURRVAL需要进行第二个查询,而RETURNING子句更加优雅。 - APC

0

如果您有一个主键:

select * from YOURTABLE
    where primary_key=(select max(primary_key) from YOURTABLE)

1
rowid 和“rownumber”是完全不同的东西。但更糟的是,max(rowid)不会给你“最新”的行。 - user330315
谢谢。这是一个打字错误,已经更正了。关于 rowid,我认为 Oracle 根据插入顺序为插入的行分配 rowid。因为有时我会使用它,并且它会给出最后插入的行。你能解释一下吗? - bonsvr
rowid 值与数据的物理存储相关,并且可以被重复使用,例如,如果删除了一行并稍后插入另一行,则新插入的行将比旧行具有“较低”的 ID。请参见文档 - Alex Poole
谢谢您的解释。我在一个OLAP环境中工作,我的表大部分不会改变,即很少进行删除和重新插入操作。这就是为什么我迄今认为rowid对我有用。 - bonsvr
2
即使您只插入表中的数据,也不能保证rowid会反映插入顺序。如果到目前为止它能正常工作,那么您只是幸运而已。 - user330315
@bonsvr,这通常不是一个好的做法。在这种特殊情况下可能有效(不确定问题作者的确切意思),但是使用MAX函数会导致错误的结果,如果其他人在你插入记录之后但在获取MAX ID之前插入了记录(除非隔离级别足够高,即ISOLATION)。此外,这仅适用于单调数字键。 - WojtusJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接