1. 程式人生 > >關於 ORA-01439: 要更改數據類型, 則要修改的列必須為空

關於 ORA-01439: 要更改數據類型, 則要修改的列必須為空

varchar2 更改 soc uip nbsp not null alter top 原本

需求:原本是定義5個字段存儲的類型全部都是 數字類型,後來需求變了,每個字段可能存儲粘接類型 如:135/200這種格式

原本的數據表結構:

CREATE TABLE MTG_SOC_MEASURE(
PKEY NUMBER(10,0),
MTG_EQUIP_INFO_PTR NUMBER(10,0), --機器信息,指向MTG_EQUIP_INFO
CUSTOMER_PART_NUMBER VARCHAR2(35), --生產型號,指向DATA0050
WORK_ORDER_NUMBER VARCHAR2(50),--工單號
FACE_TIME VARCHAR(10), --面次 TOP BOT
TTYPE VARCHAR2(30), --類別:1代表“首板”,2代表“過程監控”
SIZE_REQUIREMENTS VARCHAR(10),--尺寸要求
MEASURE_1 NUMBER(10,3),
MEASURE_2 NUMBER(10,3),
MEASURE_3 NUMBER(10,3),
MEASURE_4 NUMBER(10,3),
MEASURE_5 NUMBER(10,3),

}

現在需要把 MEASURE_1、 MEASURE_2、 MEASURE_3、 MEASURE_4、 MEASURE_5數據類型改為VARCHAR2(50),但是表已經存在記錄,因此需要中間字段進行操作,才能實現,分為以下5個步驟,如下:

--第一步,在表中加一個臨時字段

alter table MTG_SOC_MEASURE add MEASURE_1_T NUMBER(10,3);

alter table MTG_SOC_MEASURE add MEASURE_2_T NUMBER(10,3);

alter table MTG_SOC_MEASURE add MEASURE_3_T NUMBER(10,3);

alter table MTG_SOC_MEASURE add MEASURE_4_T NUMBER(10,3);

alter table MTG_SOC_MEASURE add MEASURE_5_T NUMBER(10,3);

--第二步,將目標字段的值付給臨時字段,並將目標字段置空

update MTG_SOC_MEASURE set MEASURE_1_T=MEASURE_1,MEASURE_1=null;

update MTG_SOC_MEASURE set MEASURE_2_T=MEASURE_2,MEASURE_2=null;

update MTG_SOC_MEASURE set MEASURE_3_T=MEASURE_3,MEASURE_3=null;

update MTG_SOC_MEASURE set MEASURE_4_T=MEASURE_4,MEASURE_4=null;

update MTG_SOC_MEASURE set MEASURE_5_T=MEASURE_5,MEASURE_5=null;

--第三步,修改目標類型

alter table MTG_SOC_MEASURE modify MEASURE_1 varchar2(50);

alter table MTG_SOC_MEASURE modify MEASURE_2 varchar2(50);

alter table MTG_SOC_MEASURE modify MEASURE_3 varchar2(50);

alter table MTG_SOC_MEASURE modify MEASURE_4 varchar2(50);

alter table MTG_SOC_MEASURE modify MEASURE_5 varchar2(50);

--第四步,將臨時字段的值付給目標字段,並將臨時字段置空

update MTG_SOC_MEASURE set MEASURE_1=MEASURE_1_T,MEASURE_1_T=null;

update MTG_SOC_MEASURE set MEASURE_2=MEASURE_2_T,MEASURE_2_T=null;

update MTG_SOC_MEASURE set MEASURE_3=MEASURE_3_T,MEASURE_3_T=null;

update MTG_SOC_MEASURE set MEASURE_4=MEASURE_4_T,MEASURE_4_T=null;

update MTG_SOC_MEASURE set MEASURE_5=MEASURE_5_T,MEASURE_5_T=null;

--第五步,最後一步,刪除臨時字段

alter table MTG_SOC_MEASURE drop column MEASURE_1_T;

alter table MTG_SOC_MEASURE drop column MEASURE_2_T;

alter table MTG_SOC_MEASURE drop column MEASURE_3_T;

alter table MTG_SOC_MEASURE drop column MEASURE_4_T;

alter table MTG_SOC_MEASURE drop column MEASURE_5_T;

修改後的表結構如下;

PKEY NOT NULL NUMBER(10)
MTG_EQUIP_INFO_PTR NUMBER(10)
CUSTOMER_PART_NUMBER VARCHAR2(35)
WORK_ORDER_NUMBER VARCHAR2(50)
FACE_TIME VARCHAR2(10)
TTYPE VARCHAR2(30)
SIZE_REQUIREMENTS VARCHAR2(50)
MEASURE_1 VARCHAR2(50)
MEASURE_2 VARCHAR2(50)
MEASURE_3 VARCHAR2(50)
MEASURE_4 VARCHAR2(50)
MEASURE_5 VARCHAR2(50)

關於 ORA-01439: 要更改數據類型, 則要修改的列必須為空