Oracle 오라클 MODIFY 사용법: 컬럼 길이·DEFAULT·NULL 변경 예제

컬럼 길이를 늘리고, 기본값을 정하고, NULL 허용 여부를 바꿀 때는 대부분 ALTER TABLE ... MODIFY를 사용합니다. 모양은 비슷하지만 변경 전 확인할 데이터가 서로 다릅니다. 작은 MEMBER 테이블로 자주 쓰는 다섯 가지 MODIFY를 차근차근 살펴보겠습니다.

빠른 답
길이를 늘리는 변경은 비교적 단순합니다. 반대로 길이 축소, 데이터 타입 변경, NOT NULL 설정은 기존 데이터 때문에 실패할 수 있으니 먼저 SELECT로 가능 여부를 확인해야 합니다.

예제 테이블과 데이터

CREATE TABLE MEMBER (
    MEMBER_ID   NUMBER,
    MEMBER_NAME VARCHAR2(50 CHAR),
    USE_YN      CHAR(1),
    LOGIN_COUNT NUMBER,
    REG_DATE    DATE
);

INSERT INTO MEMBER
       (MEMBER_ID, MEMBER_NAME, USE_YN, LOGIN_COUNT, REG_DATE)
VALUES (1, '김하늘', NULL, 3, SYSDATE);

COMMIT;

1. VARCHAR2 길이 늘리기

회원명 길이를 50자에서 100자로 늘립니다.

ALTER TABLE MEMBER
MODIFY MEMBER_NAME VARCHAR2(100 CHAR);

문자열 컬럼의 길이를 늘리는 작업은 흔하지만, 운영 테이블이라면 잠금과 실행 시점을 고려해야 합니다.

2. 컬럼 길이 줄이기

100자 컬럼을 30자로 줄이려면 현재 값이 그 범위에 들어오는지 먼저 확인합니다.

SELECT MAX(LENGTH(MEMBER_NAME))  AS MAX_CHAR_LENGTH,
       MAX(LENGTHB(MEMBER_NAME)) AS MAX_BYTE_LENGTH
  FROM MEMBER;

LENGTH는 문자 수, LENGTHB는 바이트 수를 확인합니다. 컬럼이 BYTE 방식인지 CHAR 방식인지도 함께 살펴보세요.

SELECT COLUMN_NAME,
       DATA_LENGTH,
       CHAR_LENGTH,
       CHAR_USED
  FROM USER_TAB_COLUMNS
 WHERE TABLE_NAME = 'MEMBER'
   AND COLUMN_NAME = 'MEMBER_NAME';

데이터가 새 길이에 맞는다고 확인한 뒤 변경합니다.

ALTER TABLE MEMBER
MODIFY MEMBER_NAME VARCHAR2(30 CHAR);
한글 컬럼 확인
VARCHAR2(30 BYTE)와 VARCHAR2(30 CHAR)는 한글 데이터에서 의미가 달라질 수 있습니다. 현재 CHAR_USED 값을 확인한 뒤 의도한 길이 의미를 명시하는 편이 좋습니다.

3. 기본값 설정·변경·해제하기

사용 여부의 기본값을 Y로 지정합니다.

ALTER TABLE MEMBER
MODIFY USE_YN DEFAULT 'Y';

이 기본값은 앞으로 INSERT에서 USE_YN을 생략할 때 적용됩니다. 이미 들어 있는 NULL은 그대로이므로 필요하다면 별도 UPDATE를 실행합니다.

UPDATE MEMBER
   SET USE_YN = 'Y'
 WHERE USE_YN IS NULL;

COMMIT;

숫자와 날짜에도 기본값을 지정할 수 있습니다.

ALTER TABLE MEMBER
MODIFY LOGIN_COUNT DEFAULT 0;

ALTER TABLE MEMBER
MODIFY REG_DATE DEFAULT SYSDATE;

기본값을 없앨 때는 DEFAULT NULL로 바꿉니다.

ALTER TABLE MEMBER
MODIFY USE_YN DEFAULT NULL;

4. NOT NULL 설정하기

NULL이 남아 있는 상태에서 NOT NULL을 지정하면 실패합니다. 먼저 개수와 실제 행을 확인합니다.

SELECT COUNT(*) AS NULL_COUNT
  FROM MEMBER
 WHERE USE_YN IS NULL;

SELECT MEMBER_ID, MEMBER_NAME
  FROM MEMBER
 WHERE USE_YN IS NULL;

업무 규칙에 맞는 값으로 보정한 다음 제약을 적용합니다.

UPDATE MEMBER
   SET USE_YN = 'Y'
 WHERE USE_YN IS NULL;

COMMIT;

ALTER TABLE MEMBER
MODIFY USE_YN NOT NULL;

처음 NOT NULL을 지정할 때 기본값까지 함께 바꾸려면 다음 형태를 쓸 수 있습니다. 바로 위의 NOT NULL 문장과 둘 중 하나만 실행하세요.

ALTER TABLE MEMBER
MODIFY USE_YN DEFAULT 'Y' NOT NULL;

5. NOT NULL 해제하기

다시 NULL을 허용하려면 NULL로 변경합니다.

ALTER TABLE MEMBER
MODIFY USE_YN NULL;

데이터 타입 변경은 왜 더 조심해야 할까?

VARCHAR2를 NUMBER로 바꾸는 것처럼 성격이 다른 데이터 타입 변경은 기존 값, 인덱스, 제약조건, 파티션 키 등에 영향을 받습니다. VARCHAR2 컬럼에 값이 들어 있으면 숫자로만 구성되어 있어도 NUMBER로 직접 MODIFY하는 데 제한이 있습니다. 새 컬럼으로 옮기는 과정에서도 변환 불가 값과 자리수를 먼저 확인해야 합니다.

운영에서는 기존 컬럼을 바로 바꾸기보다 새 컬럼을 추가하고, 변환 가능한 데이터를 검증해 옮긴 뒤, 애플리케이션 전환과 복구 계획을 세우는 방식이 더 안전할 때가 많습니다.

-- 별도 구조 예시: MEMBER에 LOGIN_COUNT_TEXT라는 문자 컬럼이 있다고 가정합니다.
-- 앞의 테스트 테이블에는 이 컬럼이 없으므로 그대로 이어 실행하지 않습니다.
ALTER TABLE MEMBER ADD LOGIN_COUNT_NEW NUMBER;

UPDATE MEMBER
   SET LOGIN_COUNT_NEW = TO_NUMBER(LOGIN_COUNT_TEXT)
 WHERE VALIDATE_CONVERSION(LOGIN_COUNT_TEXT AS NUMBER) = 1;
운영 환경 주의
DDL과 데이터 보정 UPDATE를 한 묶음으로 생각하지 마세요. UPDATE의 커밋 시점, DDL의 암시적 커밋, 실패 시 복구 경로를 각각 준비해야 합니다.

변경 후 확인하기

SELECT COLUMN_ID,
       COLUMN_NAME,
       DATA_TYPE,
       DATA_LENGTH,
       CHAR_LENGTH,
       NULLABLE,
       DATA_DEFAULT
  FROM USER_TAB_COLUMNS
 WHERE TABLE_NAME = 'MEMBER'
 ORDER BY COLUMN_ID;

다음 편에서는 실제 운영 테이블을 ALTER 하기 전에 확인할 데이터, 제약조건, 인덱스, 의존 객체와 복구 준비를 하나의 순서로 묶어보겠습니다.

공식 문서

함께 읽으면 좋은 글

컬럼 추가·삭제·이름 변경과 COMMENT 문법이 궁금하다면 1편: 자주 쓰는 ALTER TABLE 7가지에서 바로 확인하세요.

댓글 남기기