在oracle数据库中如何查询出一个表中最后插入的一条记录?

时间:2022-02-20 21:43:51
在oracle数据库中如何查询出一个表中最后插入的一条记录?假设这个表有个MAKEDATE字段,记录插入记录的时间的,我要求的是不能根据MAKEDATE的最大值去判断[/size]

25 个解决方案

#1


根据内置的rowid来查
楼主不结贴的吗?

#2


只能是从makedate的最大值来确定。

#3



select * from t1 where rowid=(
select max(rowid) from t1
)

#4


rowid

#5


学习

#6


rowid也不能判断最后一个值,如果涉及到行迁移或者一个表段涉及多个数据文件。

#7


关注下
帮顶

#8


MAX ROWID并不代表是最后插入的数据
特别是那些时间长的,经常做删减的表

#9


引用 3 楼 william3033 的回复:
SQL code
select * from t1 where rowid=(
select max(rowid) from t1
)



学习了,这个查询刚刚插入的记录很方便啊

#10


关注

#11


引用 9 楼 bwg198411 的回复:
引用 3 楼 william3033 的回复:
SQL code 
select * from t1 where rowid=( 
select max(rowid) from t1 





学习了,这个查询刚刚插入的记录很方便啊

这个方法不算正确的,只适应于新数据库

#12


插入到makedate字段时,取当前系统时间

#13


select max(rowid) from table

#14


select max(rownum) from (select a.*,rownum num from (select * from t1) a) b ;

#15


理论上说是可以的,你需要读取redo log,重做日志中会记录你所说的insert语句。
但绝非一句简单的sql可以完成。

另外ROWNUM是不可以拿来做判断的,对此讨论颇多,它是一行的唯一ID,但它本身不能作为记录先后排序的根据,请使用Order By子句,这也是Oracle官方的解释。

理论上来说加一个timestamp字段是最好的解决方案,也是避繁就简的方法,即使是trigger也有不好用的地方。

#16


rowID

#17


ROWID只适用于未作删改的表。像楼主这种问题,应该在建表的时候就留好后路,增加一列时间,取数据插入的时间。

#18


rowid

#19


学习了 

#20


这涉及到你的表结构设计,一般每个表中都会有一个内部序列号做为主键,是从序列号生成器中取值,这个字段在界面中是不显示的。类似oracle的rowid的功能。
根据这个内部序号取最大就行了。

#21


问题已解决了,多谢大家的回答。通过row id是不行,max(rowid)是取出左后已行记录,是位置,而不是时间。

#22


rowid不行的,不过可以加一个列,从sequence取值,用这个值来判断最后,

不过这个做法和makedate差不多的方式,

不过10g开通的row dependencies的话,虽然做不到你这样的要求。不过找到最后更新的记录,倒是可以做到的,如果开通row dependencies的话,伪列ora_rowscn将会记录下该条记录的修改的scn号,scn号和timestamp是对应的,scn越大 timestamp也就越到,也就找到最后更新的记录了。

==================================================================
Inthirties关注Oracle数据库 维护 优化,安全,备份,恢复,迁移,故障处理

如果你需要帮助或想和我一起学习的请联系
联系方式QQ:370140387
电子邮件:dba@Inthirties.com
网站: http://www.inthirties.com

#23


哦。问题解决了。有好的解决方案吗?贴出来和大家分享。谢谢。

#24


学习了,原来用rowid还是有一定的局限性

#25


select * from <表名> where rowid=(select max(rowid) from <表名>);

#1


根据内置的rowid来查
楼主不结贴的吗?

#2


只能是从makedate的最大值来确定。

#3



select * from t1 where rowid=(
select max(rowid) from t1
)

#4


rowid

#5


学习

#6


rowid也不能判断最后一个值,如果涉及到行迁移或者一个表段涉及多个数据文件。

#7


关注下
帮顶

#8


MAX ROWID并不代表是最后插入的数据
特别是那些时间长的,经常做删减的表

#9


引用 3 楼 william3033 的回复:
SQL code
select * from t1 where rowid=(
select max(rowid) from t1
)



学习了,这个查询刚刚插入的记录很方便啊

#10


关注

#11


引用 9 楼 bwg198411 的回复:
引用 3 楼 william3033 的回复:
SQL code 
select * from t1 where rowid=( 
select max(rowid) from t1 





学习了,这个查询刚刚插入的记录很方便啊

这个方法不算正确的,只适应于新数据库

#12


插入到makedate字段时,取当前系统时间

#13


select max(rowid) from table

#14


select max(rownum) from (select a.*,rownum num from (select * from t1) a) b ;

#15


理论上说是可以的,你需要读取redo log,重做日志中会记录你所说的insert语句。
但绝非一句简单的sql可以完成。

另外ROWNUM是不可以拿来做判断的,对此讨论颇多,它是一行的唯一ID,但它本身不能作为记录先后排序的根据,请使用Order By子句,这也是Oracle官方的解释。

理论上来说加一个timestamp字段是最好的解决方案,也是避繁就简的方法,即使是trigger也有不好用的地方。

#16


rowID

#17


ROWID只适用于未作删改的表。像楼主这种问题,应该在建表的时候就留好后路,增加一列时间,取数据插入的时间。

#18


rowid

#19


学习了 

#20


这涉及到你的表结构设计,一般每个表中都会有一个内部序列号做为主键,是从序列号生成器中取值,这个字段在界面中是不显示的。类似oracle的rowid的功能。
根据这个内部序号取最大就行了。

#21


问题已解决了,多谢大家的回答。通过row id是不行,max(rowid)是取出左后已行记录,是位置,而不是时间。

#22


rowid不行的,不过可以加一个列,从sequence取值,用这个值来判断最后,

不过这个做法和makedate差不多的方式,

不过10g开通的row dependencies的话,虽然做不到你这样的要求。不过找到最后更新的记录,倒是可以做到的,如果开通row dependencies的话,伪列ora_rowscn将会记录下该条记录的修改的scn号,scn号和timestamp是对应的,scn越大 timestamp也就越到,也就找到最后更新的记录了。

==================================================================
Inthirties关注Oracle数据库 维护 优化,安全,备份,恢复,迁移,故障处理

如果你需要帮助或想和我一起学习的请联系
联系方式QQ:370140387
电子邮件:dba@Inthirties.com
网站: http://www.inthirties.com

#23


哦。问题解决了。有好的解决方案吗?贴出来和大家分享。谢谢。

#24


学习了,原来用rowid还是有一定的局限性

#25


select * from <表名> where rowid=(select max(rowid) from <表名>);