再次开刷IBM的垃圾

最近因为公司项目需要,必须使用DB2,因为原来一起用Oracle MySQL的,使用了DB2才知道什么叫数据库中的垃圾,而且是臭气熏天的垃圾!

[b][size=x-large]罪状之1:更改表结构超级麻烦[/size][/b]

假设有以下一个表:

create table t1(a int,b int c int,d int);

你希望删除b,c,d新增e,f

alter table t1 drop column b;
alter table t1 drop column c;
alter table t1 drop column d;
alter table t1 add e int;
alter table t1 add f int;

这是一个再简单不过的表结构更改语句了,在DB2中一执行,到第4行居然就报错了,错误是:
[quote]SQL20054N 所处的状态对该操作无效.原因码 23[/quote]
查了[url]http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.messages.sql.doc/doc/msql20054n.html?cp=SSEPGG_9.7.0%2F2-6-27-19-45&lang=zh-cn[/url]
才知道,DB2拥有一个如果恶心的限制:
[quote]
对表结构更改最多只能做3次,3次后必须要求你执行reorg命令!!!
[/quote]

也就是说,你必须在第3和第4句之间手工加入:

alter table t1 drop column b;
alter table t1 drop column c;
alter table t1 drop column d;
reorg table t1;/*这里要你手工插入*/
alter table t1 add e int;
alter table t1 add f int;
reorg table t1;/*为了防止后续的更改出错,全体变更完成后,你还要在这里手工插入*/


这种完全可以由DB2自己内部去做的事情,居然要踢给用户手工去做,完全不顾使用者的感受,学院主义,官僚主义暴露无遗啊!


[b][size=x-large]罪状之2:数据分页[/size][/b]

mysql直接使用limit x,y 就可以实现分页了:

select * from table limit 10,20 


Oracle通过子查询实现分页:

select * from (select rownum,name from table where rownum <=endIndex ) where rownum > startIndex


下面再来看看DB2的分页:

select * from ( select ROW_NUMBER() OVER( ORDER BY DOC_UUID DESC ) AS ROWNUM,t.*
from DT_DOCUMENT t ) a


看到那串神奇的ROW_NUMBER() OVER( ORDER BY DOC_UUID DESC )没有,如果你需要按序排序,DB2要求你写这个奇怪的语法。想想将一个普通的SQL转换为分页的SQL有多难啊。(幸亏Hibernate的Dialect类可以帮忙我们完成,否则会吐血三升而亡的 :shock: )

DB2的罪状,还很多啦,后续不断补充上,很欢迎大家涮涮IBM那一群群头上长角,浑身长刺的怪胎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值