• 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就是了。

  • 相关阅读:
    shell-脚本_系统监测
    shell-脚本_防火墙规则的简单应用
    shell-命令_find
    shell-命令_cut
    shell-条件测试语句_test
    Error:java: 不再支持源选项 5。请使用 6 或更高版本。
    android项目删除recycleview相对应的数据库数据后闪退
    大作业--社团管理系统总结
    北京地铁出行路线代码分析
    北京地铁出行路线规划设计
  • 原文地址:https://www.cnblogs.com/liuyouying/p/6363862.html
Copyright © 2020-2023  润新知