ORA-01450: 키의 최대 길이(6398)를 초과했습니다 (ORA-01450: maximum key length (6398) exceeded)

ORA-01450: 키의 최대 길이(6398)를 초과했습니다 오류는 오라클 데이터베이스에서 인덱스(특히 유니크 제약조건 또는 PK 제약조건) 를 생성할 때, 해당 인덱스의 키 값의 길이 총합이 허용 범위(6398 바이트)를 초과했을 때 발생합니다.

🔍 ORA-01450 원인?

  1. VARCHAR2 컬럼에 인덱스를 생성하려고 할 때, 해당 컬럼(또는 컬럼들의 조합)이 너무 길어서 인덱스 키 길이 제한을 초과하는 경우
  2. 멀티바이트 문자셋 (예: AL32UTF8) 을 사용할 경우, 문자당 최대 4바이트를 차지할 수 있어 실제 인덱스 크기가 빠르게 커지는 경우
  3. 복합 인덱스 또는 복합 PK/UK 제약조건에서 여러 문자열 컬럼을 묶었을 경우 자주 발생.

✅ 해결 방법

1. 문자 길이를 줄이기

  • 인덱스를 생성하려는 컬럼의 VARCHAR2 길이를 줄이기.
    ALTER TABLE your_table MODIFY your_column VARCHAR2(100);

2. 인덱스 컬럼 수 줄이기

  • 복합 인덱스 또는 PK 제약조건에서 너무 많은 컬럼을 포함하고 있는지 확인하고, 필요 없는 컬럼은 제외합니다.

    3. 인덱스를 함수 기반 인덱스로 대체하기 (추천하지 않음)

    • 일부 상황에서는 전체 컬럼이 아니라 앞부분만 인덱스에 포함되도록 할 수 있습니다.
      CREATE INDEX idx_short ON your_table (SUBSTR(your_column, 1, 100));

    📌 예시 문제 상황

    CREATE TABLE table_name (
      column_name_1 VARCHAR2(4000),
      column_name_2 VARCHAR2(4000),
      CONSTRAINT pk_name PRIMARY KEY (column_name_1, column_name_2)
    );

    이 경우 PK의 길이가 최대 길이(6398)를 초과하여 오류 발생.

    해결

    -- 문자열 길이를 줄이거나
    ALTER TABLE table_name MODIFY column_name_1 VARCHAR2(500);
    ALTER TABLE table_name MODIFY column_name_2 VARCHAR2(500);
    
    -- 또는 앞부분만 인덱싱
    CREATE INDEX idx_test ON test (SUBSTR(col1,1,100), SUBSTR(col2,1,100));
    이전최근
    댓글 쓰기
    가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗