本博客记录一下一次踩坑记录,过程是这样的,在跟一个bug,涉及到一张中间表,然后这张中间表的主键是自增的,不过因为对接其它系统,出现了主键唯一性冲突,所以我就只好改数据了,思路是想查最大值,然后修改数据。原本认为既然是一张中间表,那我不改关联表就好,我改中间表的主键应该不会影响系统。不料还是出现了数据问题了。
查询这张中间表的主键的最大值时,我并没有注意到是varchar类型的,以为是number类型的,数据库采用Oracle。PS:Oracle并没有int类型,这点和MySQL不一样。
查询到间表的id最大的值,很自然的,就敲条sql
select max(id) from Table a;
这条sql就得到最大值,看起来很正常,不过我并没有注意到这个id是varchar类型,所以开发过程,需要仔细一点,虽然我们都知道这个道理,不过在项目很赶,或者状态不好的情况,还是很多人不仔细,所以我还是记录一下,仅仅是作为个人的笔记记录一下而已,然后仅仅是参考,希望能给别人一些启发。
我查出的最大值是9999,不过偶然发现,竟然有个10000+的数值,这样我就纳闷了。所以,这里说一下,这个id是字符串类型的,字符串类型的排序和number类型的排序是不一样的,字符串排序是先比较第一个字符,eg:这里列举"9"和"10"的列子,这里的"9"和"10"都是字符串类型的,比较过程是这样的,先从第一个字符比较,'9'比'1'大,所以,"9"排在前面,"10"排在后面。PS:字符串比较就是这样,先比较第一个字符,如果相等,在比较第二个字符,以此类推...
所以SQL:select max(id) from Table a;就会出现"9"比"10"大的情况,这里的id是字符串类型。
要得出正确的情况:在Oracle里就要用SQL:
select max(to_number(id)) from Table a;
然后我在改数据的过程出现了问题,然后幸好有公司导师相助,得到了一条数据库回滚的SQL,所以还是学到了。下面给出SQL,希望可以帮助学习的人
【表数据恢复回N分钟之前】 alter table 表名 enable row movement; flashback table 表名 to timestamp systimestamp - interval 'N' minute;
作者:smileNicky
链接:https://www.jianshu.com/p/019caff4e0e2