본문 바로가기

컴퓨터일반/DB

[Oracle] NUMBER 컬럼 사이즈 변경 시 "데이터가 있으면 축소 불가" 해결 방법

오라클 데이터베이스를 운영하다 보면 테이블 설계 변경으로 인해 숫자형(NUMBER) 컬럼의 사이즈를 조정해야 할 때가 있습니다. 하지만 데이터가 이미 들어있는 상태라면 마음대로 변경되지 않아 당황스러운 경우가 생기죠.

오늘은 NUMBER 컬럼 사이즈 변경 시 발생하는 오류 원인과 최신 버전에서도 통용되는 해결 팁을 정리해 보겠습니다.


1. 왜 오류가 발생할까? (ORA-01440)

데이터가 존재하는 컬럼의 사이즈를 줄이려고 하면 오라클은 다음과 같은 오류를 뱉어냅니다.

ORA-01440: column to be modified must be empty to decrease precision or scale (정밀도 또는 스케일을 축소할 열은 비어 있어야 합니다)

이 오류는 단순히 전체 자릿수를 줄일 때뿐만 아니라, 소수점 자릿수(Scale)를 늘릴 때도 발생할 수 있어 주의가 필요합니다.

💡 여기서 잠깐! 소수점을 늘리는데 왜 "축소"라고 할까?

예를 들어 NUMBER(13, 3)을 NUMBER(13, 5)로 변경한다고 가정해 봅시다.

  • 기존: 전체 13자리 중 소수점 3자리 → 정수 부분은 10자리
  • 변경: 전체 13자리 중 소수점 5자리 → 정수 부분은 8자리

결과적으로 정수 부분이 10자리에서 8자리로 줄어들기 때문에 오라클은 이를 "데이터 손실 위험이 있는 축소"로 판단하여 허용하지 않습니다. 따라서 소수점을 늘릴 때는 정수 부분의 자릿수도 함께 고려하여 NUMBER(15, 5)와 같이 전체 사이즈를 키워줘야 합니다.


2. 데이터가 있는 상태에서 사이즈를 줄여야 한다면?

비즈니스 로직상 반드시 사이즈를 축소해야 하는데 이미 데이터가 수만 건 있다면 어떻게 해야 할까요? 최신 버전에서도 가장 안전한 방법 3가지를 소개합니다.

방법 ① 임시 컬럼 활용 (가장 일반적)

데이터를 잠시 옮겨두고 컬럼을 교체하는 방식입니다.

SQL
 
-- 1. 임시 컬럼 추가
ALTER TABLE 테이블명 ADD (TEMP_COL NUMBER(10,2));

-- 2. 데이터 복사
UPDATE 테이블명 SET TEMP_COL = 원래컬럼;

-- 3. 원래 컬럼 데이터 삭제 (NULL로 업데이트)
UPDATE 테이블명 SET 원래컬럼 = NULL;

-- 4. 원래 컬럼 사이즈 변경 (데이터가 없으므로 가능)
ALTER TABLE 테이블명 MODIFY (원래컬럼 NUMBER(10,2));

-- 5. 데이터 원복 및 임시 컬럼 삭제
UPDATE 테이블명 SET 원래컬럼 = TEMP_COL;
ALTER TABLE 테이블명 DROP COLUMN TEMP_COL;

방법 ② 테이블 재생성 (CTAS 활용)

데이터 양이 아주 많고 점검 시간이 확보된다면 테이블을 새로 만드는 것이 깔끔합니다.

SQL
 
-- 1. 원하는 구조로 새 테이블 생성 (데이터 포함)
CREATE TABLE 테이블명_NEW AS SELECT * FROM 테이블명;

-- 2. 기존 테이블 삭제 (또는 백업용 이름 변경)
DROP TABLE 테이블명;

-- 3. 새 테이블 이름 변경
ALTER TABLE 테이블명_NEW RENAME TO 테이블명;

주의: 제약조건(PK, FK), 인덱스, 권한(Grant) 등을 다시 설정해야 합니다.

방법 ③ 12c 이상 버전의 'Invisible Column' 활용 (고급)

컬럼 순서를 유지해야 하거나 운영 중 가용성을 높이고 싶을 때 사용합니다. 임시 컬럼을 만들되 INVISIBLE 옵션을 주어 애플리케이션에 영향을 주지 않고 작업할 수 있습니다.


3. 결론 및 요약

  • 확장: 데이터가 있어도 언제든지 가능합니다. (ALTER TABLE ... MODIFY ...)
  • 축소: 데이터가 있으면 불가능합니다. (전부 NULL로 만들거나 임시 컬럼을 써야 함)
  • 소수점: 소수점 자릿수를 늘릴 때는 정수 부분이 줄어들지 않도록 전체 자릿수(Precision)도 함께 늘려주세요.

오라클의 NUMBER 타입은 정밀도가 생명인 만큼, 설계 단계에서 조금 넉넉하게 잡는 것이 나중에 고생하지 않는 지름길입니다!


Copyright 2026. [Ryon] all rights reserved.