2014-04-18 5 views
2

이라는 열이있는 call_log 테이블이 있다고합시다. 더 나아가 내가 테이블을 모을 때 duration을 숫자가 아닌 varchar 열로 만드는 실수를 범했습니다. 이제 해당 열을 올바르게 정렬 할 수 없습니다.데이터가있는 열의 데이터 유형을 변경하는 방법

ORA-01439: column to be modified must be empty to change datatype. 

내 테이블이 사용 된 데이터를 가지고있다 ... 내가 발행 그래서 나는 열 이름을 바꾸려면 ...

ALTER TABLE call_log MODIFY (duration NUMBER); 

그러나 나는 얻을! 그리고 저는 그 자료를 잃고 싶지 않습니다. 데이터를 손실하지 않고 열의 데이터 유형을 수정하려면 어떻게해야합니까?

답변

5

올바른 데이터 형식으로 임시 열을 만들고 데이터를 새 열로 복사 한 다음 이전 열을 삭제하고 새 열의 이름을 이전 열의 이름과 동일하게 변경합니다.

ALTER TABLE call_log ADD (duration_temp NUMBER); 
UPDATE call_log SET duration_temp = duration; 
ALTER TABLE call_log DROP COLUMN duration; 
ALTER TABLE call_log RENAME COLUMN duration_temp TO duration; 

이 대답의 아이디어는 Oracle's forums에서 나옵니다.

1

이전 솔루션은 그러나 당신이 call_log 테이블 구조의 열 순서를 변경하지 않는 경우, 다음 단계는이위한 우수 :

create table temp_call_log as select * from call_log; /* temp backup table for call_log */ 
UPDATE call_log SET duration = null; 
/*check,... be sure.... then commit*/ 
commit; 
ALTER TABLE call_log MODIFY duration NUMBER; 
UPDATE call_log c SET c.duration = (select t.duration from temp_call_log t where t.primarykey_comumn = c.primarykey_column); 
/*check,... be sure.... then commit*/ 
commit; 
drop table temp_call_log; 

주 1 :의 기본 키 변경 primarykey_comumn 테이블 call_log.

note2 :이 솔루션은 데이터 크기가 크지 않다고 가정합니다.

관련 문제