• Oracle学习 第18天 RowID与RowNum


    女儿半夜不睡觉,本来弄到一半的bat脚本,只好停下来,抱着看会Oracle教程,没想到解决了一个很久的困惑。

    一直没搞明白为什么Oracle没有自增ID列,还要再去弄触发器和序列,麻烦得多。

    原先Oracle自带了一个RowID伪列,使用一串唯一的字符串作为“主键”,这样就和SqlServer的自增主键差不多了,只不过一个是数字,一个是字符。

    用于删除指定行和处理重复数据时特别有用

    1、删除指定行:

    在SqlServer中,一般会先查一下数据,再根据主键ID来删除。原先不知Oracle怎么删指定行,比如有两列A和B,其中A的值和其它列有重复,B的值和其它列也有重复,A和B的值是唯一的,那就必须Delete From XX WHERE A = 'A' AND B = 'B'。如果列多的话,就得不停地AND下去,直到唯一为止。

    现在有了RowID,就可以很方便地删除某一行。

    2、删除完全重复数据:

    有些表没有主键的话,可能有完全重复的数据,这时要删就麻烦了。SqlServer上我一般是增加一列自增列,删完后再去自增列去除。

    Oracle直接就有RowID可以用,以前我还以为也要像SqlServer那样,再弄一列,通过序列处理自增,删完再去掉。

    3、删除部份重复数据:

    这个经常碰到,一些列没有设置约束,也不是主键,业务上又要求唯一。在数据维护时就要求批量删除掉重复数据。

    做法是 DELETE FROM XX WHERE ID NOT IN ( SELECT MIN(ID) FROM XX GROUP BY XXX)

    如果表没有自增ID就要上述第2条那样先加一列才能处理,现在Oracle的RowID直接就能用了。

    4、RowNum:

    自带的行号,分页时很有用,最不能忍的是不支持像MySql那样的Limit或Linq的Skip...Take...之类的语法,要取中间一段,就要用子查询。

    不过话说回来,SqlServer要分页的话,row_number() over也不比RowNum好多少,不过支持Between就是了。

  • 相关阅读:
    观察者(Observer)模式
    Stragety Pattern(策略模式)
    数据库设计范式深入浅出
    建造者(Builder)模式
    吉杰,以及快乐男声
    言情小说通用情节[转]
    过年的任务
    将一家创业公司三年之内推动上市是1999年的思维方式
    修改系统时间格式?解决now()
    经济类吴晓波的《大败局》,韩德强的《碰撞》。几年前看的了,现在还很有印象。
  • 原文地址:https://www.cnblogs.com/liuyouying/p/6363862.html
Copyright © 2020-2023  润新知