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

  • 相关阅读:
    flask基础之请求处理核心机制(五)
    flask基础之app初始化(四)
    python内置模块之itertools
    python基础之命名空间
    python进阶之类常用魔法方法和魔法属性
    python进阶之函数和类内建魔法属性
    mysql笔记一——安装和设置root密码
    centos7环境安装rabbitMQ
    查询数据库锁
    [转]低成本搭建谷歌镜像
  • 原文地址:https://www.cnblogs.com/liuyouying/p/6363862.html
Copyright © 2011-2022 走看看