ORA-01439: 데이터 유형을 변경할 열은 비어 있어야 합니다 해결하기 (ORA-01439: column to be modified must be empty to change datatype)

ORA-01439: column to be modified must be empty to change datatype 오류의 원인과 해결 방법에 대해 알아보도록 합시다.

ALTER TABLE MODIFY 구문으로 데이터타입을 변경하려면, 변경을 시도하려는 컬럼은 반드시 NULL값만을 포함해야 합니다. ORA-01439 오류는 컬럼에 데이터가 있어서 발생하는 오류이기 때문에, 이것을 해결하려면 컬럼의 모든 값을 NULL로 설정하여야 합니다. 컬럼 값이 중요하지 않은 값이라면 바로 NULL로 설정하여도 되지만, 데이터타입 변경 이후에 값을  그대로 복구하고 싶다면 임시 테이블을 생성하여 데이터를 저장하고 변경하면 됩니다.

ORA-01439: 데이터 유형을 변경할 열은 비어 있어야 합니다 해결하기

컬럼의 값을 모두 NULL로 업데이트하는 방법

데이터타입을 변경하려는 컬럼의 값을 업데이트 구문을 통해 NULL로 업데이트합니다. 기존의 컬럼에 들어있던 값이 필요 없는 경우에 진행합니다.

--혹시라도 해당 컬럼이 NOT NULL 제약조건이 있는 경우

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME NULL;

--NULL값으로 업데이트 합니다.

UPDATE TABLE_NAME SET COLUMN_NAME = NULL;

컬럼의 값을 모두 보존하는 방법

데이터타입을 변경하려는 컬럼의 값을 그대로 보존하고 싶은 경우에는 다음과 같이 할 수 있습니다.

  • 백업 테이블을 임시로 생성하고 데이터를 저장합니다.
  • 테이블의 데이터를 삭제합니다.
  • 데이터타입을 수정합니다.
  • 데이터를 다시 옮깁니다.

다음의 예제와 같이 진행할 수 있습니다. 이때에는 모든 데이터를 삭제하고 다시 삽입하기 때문에, 데이터의 인서트, 업데이트, 딜리트 등이 발생하지 않도록 조치를 하시고 진행하세요. 해당 예시자료는 딜리트를 이용하였는데, NULL로 업데이트하고 백업 테이블의 데이터와 본 테이블의 키값을 이용한 업데이트 구문으로 변경하여 사용해도 무방합니다.

--백업 테이블을 임시로 생성합니다. AS SELECT * FROM 은 모든 테이블 정보를 복사합니다.

CREATE TABLE TABLE_NAME_BAK AS SELECT * FROM TABLE_NAME;

--테이블 데이터를 삭제하고 커밋 하겠습니다.

DELETE TABLE_NAME;

COMMIT;

--더이상 데이터가 없으므로 굳이 데이터타입 변경 대상 컬럼의 NULL여부는 관계가 없습니다. 수정합니다.

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME VARCHAR2(1);

--변경된 테이블에 기존의 데이터를 다시 인서트 합니다.

INSERT INTO TABLE_NAME SELECT * FROM TABLE_NAME_BAK;    

--백업 테이블을 삭제하겠습니다.

DROP TABLE TABLE_NAME_BAK CASCADE CONSTRAINTS;

댓글