女儿半夜不睡觉,本来弄到一半的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就是了。