zoukankan      html  css  js  c++  java
  • 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就是了。

  • 相关阅读:
    Leetcode 238. Product of Array Except Self
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 290. Word Pattern
    Leetcode 205. Isomorphic Strings
    Leetcode 107. Binary Tree Level Order Traversal II
    Leetcode 102. Binary Tree Level Order Traversal
    三目运算符
    简单判断案例— 分支结构的应用
    用switch判断月份的练习
    java基本打印练习《我行我素购物系统》
  • 原文地址:https://www.cnblogs.com/liuyouying/p/6363862.html
Copyright © 2011-2022 走看看