最近項目中有這樣一個變動,需要修改數據庫中某個字段類型。但是,表中已經存在大量數據了。DML句:"alter table 表名 modify 字段名 新數據類型 " 只對空表起作用,當存在數據時,不允許修改。
下面介紹兩種不刪除數據,更改數據類型的操作方法。
首先,我們先熟悉alter對字段的各種操作,后面會用得到。
對字段操作
操作方法
更新字段名
alter table TABLE_NAME rename column column_old to column_new;
添加字段
alter table TABLE_NAME add COLUMN_NAME varchar(10);
刪除字段
alter table TABLE_NAME drop column COLUMN_NAME;
添加字段並附值
alter table TABLE_NAME ADD COLUMN_NAME NUMBER(1) DEFAULT 1;
修改字段值
update TABLE_NAME set filedname=value where filedname=value;
修改字段數據類型
alter table tablename modify filedname varchar2(20);
例如,下面要將fraction的double類型修改為float類型
方法一:
(1) 添加一個新字段 newfield,數據類型設置為新數據類型
(2) 將要修改字段的值復制到剛添加的列中 oldfield—newfield
(3) 刪除原來字段oldfield
(4) 重命名newfield
alter table test add fraction_temp float
update test set fraction_temp =fraction
alter table test drop column fraction
alter table test rename column fraction_temp to fraction
方法二:
(1) 添加一個臨時字段 field_temp,數據類型設置為新數據類型
(2) 將要修改字段的值復制到剛添加的臨時列中 oldfield——field_temp,清空原來字段oldfield值
(3) 修改oldfield的數據類型
(4) 將值從臨時字段中拷貝回來
(5) 清空臨時字段值,刪除臨時字段
alter table test add fraction_temp float
update test set fraction_temp=fraction,fraction=null
alter table test modify fraction float
update test set fraction=fraction_temp,fraction_temp=null
alter table test drop column fraction_temp
第二種方法通過中間字段來操作,雖然步驟多了一步,但是可以避免第一種方法導致的字段位置變動,不過位置變動也沒有什么大的影響吧。
其實,發現還有更簡單的方法,數據庫客戶端支持粘貼復制功能,你可以打開兩個客戶端,保證一個客戶端顯示着表中的所有數據,同時從另一個客戶端中刪除數據,修改數據類型后,再從還保留着數據的客戶端中將數據粘過來。