用慣了Oracle的alter語句,把這些語句在db2中使用有些是不行的。
舉例表如下:
create table emp (id int, name char(20),salary decimal(18,2)); --建立表emp
db2的alter語句用法如下:
(1)增加列
alter table emp add sex char(1); ---增加sex這一列
(2)更改欄位類型
alter table emp alter column sex set data type char(3); ---將sex這一列修改為char(3)
alter table emp alter column sex set data type char(2); ---將sex這列修改回char(2)
insert into emp values (1,'smith',18.23,'22'); ---向emp表插入一條記錄
alter table emp alter column sex set data type char(3); ---在有記錄的情況下,將sex這列修改為char(3), 成功
alter table emp alter column sex set data type char(1); ---在有記錄的情況下,將sex這列修改為char(1), 失敗---“指定的屬性與現有列不相容”
alter table emp alter column sex set data type decimal(18,2); ---在有記錄的情況下,將sex這列修改為decimal(18,2), 成功(原來是'22'被轉換成了22.00)
alter table emp alter column sex set data type char(2); ---將sex這列修改回char(2) 失敗---“指定的屬性與現有列不相容”
alter table emp alter column sex set data type char(5); ---將sex這列修改為char(5) 成功(原來的數字22.00被轉換成了字元'22.00',5個位元組)
delete from emp; insert into emp values (1,'smith',18.23,'dd'); ----刪除原來的資料,並插入新的資料
alter table emp alter column sex set data type decimal(18,2); ---在有記錄的情況下,將sex這列修改為decimal(18,2), 失敗---“指定的屬性與現有列不相容”('dd'和數字不相容)
以上語句是我再windows平台+db2v9.5上實驗啟動並執行。
我像通過以上語句,應該可以對db2的alter語句有一個比較詳細的瞭解,
如果要更改db2的類型,
(a)首先要保證目標類型和要當前表中所有的資料類型都要相容,比如如果要更改char為decimal,那麼原先的欄位就不能出現字元,比如abcd等,只能出現資料型字元,比如1,2,3等。否則db2就報錯,說“格式不相容”。
(b)如果你要更改的只是size大小,而資料的類型不變,那麼要保證欄位是增加的,比如從char(5)到char(10),decimal(18,2)到decimal(19,2),這樣是沒問題的。
如果想縮減欄位的size,那麼就要保證所有表中的資料都小於你縮減後的值,否則也會報錯。此時如果有需求必須要改變,那麼就只能刪除列,然後重建列了。當然重建表也可以。
(3)刪除列
alter table emp drop column sex;
(4)為欄位添加預設值
alter table emp add sex char(1);
alter table emp alter column sex set default 'm';
(5)添加帶預設值的欄位
alter table emp add addr char(20) not null with default 'beijing';
另外要注意的是,無論是添加,刪除,還是更改欄位的時候,為了保險起見,最好都運行一下reorg命令
reorg table table_name;
否則可能會造成其他動作時報錯。