oracle取数据库中最新的一条数据可能会遇到的b
记一次 开发中遇到的坑
第一种情况 rowid
select from table where rowid=(select max(rowid) from table )
这种方式是取最大的rowid作为最新的数据,有一个隐患 数据库一旦有删除操作,rowid不能保证每次都是递增的!即max(rowid)并不一定就是最新的数据,尽管可能不会每次复现 但这个问题是绝对存在的!
第二种情况 使用rownum (或相同思路)
select t. from (select ti.sysno,ti.cr_date from t_insurance ti order by ti.selldatetime desc ) t where rownum = 1
这有很大一个问题,如果排序字段数据库使用的是date类型,而且存在时分秒刚好相同的数据(尤其高并发项目中),我们子查询语句中 的确可以准确的 order by desc出来,一旦外层套了一层select ,查出来的很可能就不是子查询里面的第一条数据,详细如图
11:35:25存在两条数据 执行选中的查询sql,
当我们加了一层select,可以看到 已经不是上面的第一条数据了
类似的,不管怎么写的花里胡哨,如下sql,子查询里面 row_row = 1时,sysno确实为3126 1018 0001 5Z14,外面套了一层select 结果也变了
select from (select t.sysno, t.cr_date, row_number() over(order by t.cr_date desc) row_row from t_insurance t) where row_row = 1
同理 用with temp as 也是一样的情况,取不到最新的结果。
解决方法
暂时没有从写什么高级的sql语句层面想到好的办法,(如果有大佬有好的方法,希望可以指点一二)
提供一些思路如果项目没有上生产 或者说是小项目,那还可以追加自增列,或者数据库使用时间戳类型,上了生产 改动数据库是大忌。
一般的,数据表中还会有其它的字段可以作为辅助排序,例如一段时间内的单号是递增的 那么可以多个字段排序 例如 order by date desc,orderNo desc ,(我是通过这种方式解决的,但还是不治根 万一哪天遇到数据库没其他辅助排序字段 问题还是得不到解决)
实在不行 就根据实际业务 看看能不能对时间加限制(如果数据量不大 不加也罢),select from table where date >=xxxx order by desc date ,然后把一堆数据查询出来,在代码里面list.get(0)取出第一条数据。
到此这篇关于oracle取数据库中最新的一条数据可能会遇到的bug的文章就介绍到这了,更多相关oracle取数据库中最新的一条数据内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程