컬럼 길이를 늘리고, 기본값을 정하고, 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 하기 전에 확인할 데이터, 제약조건, 인덱스, 의존 객체와 복구 준비를 하나의 순서로 묶어보겠습니다.
공식 문서
- Oracle Database 19c SQL Language Reference: ALTER TABLE
- Oracle Database 19c SQL Language Reference: VALIDATE_CONVERSION
컬럼 추가·삭제·이름 변경과 COMMENT 문법이 궁금하다면 1편: 자주 쓰는 ALTER TABLE 7가지에서 바로 확인하세요.