对比mysql oracle db2 的部分ddl语法
建表、删除表:mysql oracle db2基本相同
create table test(id integer,name varchar(20),address varchar(20));
(oracle 多用varchar2,但也支持varchar)
drop table test;
但是修改表就有很大的不同了,如下:
1,增加列:相同
alter table test add mail varchar(128);
2,删除列:
oracle 与mysql相同:alter table test drop column mail;
db2 :不提供删除列功能(解决办法是删除表,重建)
3,更改列名
oracle : alter table test rename column mail to mail2;
mysql : alter talbe test change mail mail2 varchar(128);
db2 : 不提供更改列名功能(解决办法同删除,或者通过建立一个新视图解决)
4,更改列类型
oracle :alter table test modify column (mail2 integer);
mysql :alter table test modify column mail2 integer;
db2 :alter table test alter mail varchar(256) 只可以加宽,不能更改类型
5,更改列的限制(主键、非空)
db2 :alter table test alter mail null/not null;
mysql :alter table test modify mail2 varchar(29) not null;
oracle:alter table test modify mail2 null/not null;
关于db2不提供解决办法,参考这里
http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/0207adamache/0430_adamache3.html
截取部分原文
-------------------------------------------------------------------------------
DROP COLUMN:DB2 不允许您删除一个列。我可以想到您希望删除列的三个理由:
回收空间:如果您希望这样做,可以导出您希望保存的数据,删除那个表,用您需要的那些列重新创建表,然后装入
这个表。这是否代价高昂?当然是,但是回收空间需要这样或者 REORG TABLE。这些本来就是代价高昂的操作。
这个列不再是行的逻辑部分:例如,您意识到您的雇员可能有两个地址,并且停止跟踪雇员(employee)表中的地址
(雇员表和雇员地址(employee_address)表之间现在有 n:m 关系)。在雇员表上创建一个不包含地址列的视图。
如果您真的要用新奇的方法,可以使用 RENAME TABLE 命令给基表一个新的名称,然后将原始表名作为该视图的
名称。您的视图也可以连接雇员表中的有用列和从雇员地址获得的地址。现在我们回到了关系的正道。
列变宽了。如果它是 VARCHAR,那您运气不错。DB2 允许您将 VARCHAR 列最多加宽至表空间(tablespace)
中定义的页大小宽度(缺省的 4K 页大小为 4,005,而在 32K 页上最多为 32,672):
---------------------------------------------------------------------------------
http://www-1.ibm.com/support/docview.wss?uid=swg21004049
部分截取原文