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