Oracle ORA-02253 오류 원인과 해결 방법 완벽 가이드

ORA-02253
2026년 08월 14일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-02253 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-02253 constraint specification not allowed here 는?

ORA-02253 에러는 Oracle SQL 문법에서 제약 조건(Constraint)을 허용하지 않는 위치에 제약 조건을 명시했을 때 발생하는 오류입니다. 주로 ALTER TABLE 문이나 CREATE TABLE 문에서 제약 조건을 잘못된 위치에 작성하거나, 제약 조건을 지원하지 않는 구문 내에서 사용하려 할 때 Oracle 파서(Parser)가 이 에러를 반환합니다. 예를 들어 데이터 타입 변경(MODIFY) 구문에서 직접 인라인(inline) 제약 조건을 추가하거나, 지원되지 않는 방식으로 CONSTRAINT 키워드를 사용하면 이 오류가 발생합니다.


주요 발생 원인

1. ALTER TABLE MODIFY 구문에서 인라인 제약 조건 사용

ALTER TABLE ... MODIFY 구문은 기존 컬럼의 데이터 타입이나 기본값을 변경하는 용도로 사용됩니다. 이 구문 내에서 PRIMARY KEY, UNIQUE, FOREIGN KEY와 같은 제약 조건을 인라인 방식으로 직접 명시하면 Oracle은 ORA-02253을 반환합니다. MODIFY 절은 제약 조건 추가 방식을 지원하지 않으며, 제약 조건 추가는 별도의 ADD CONSTRAINT 절을 통해 수행해야 합니다.

2. CREATE TABLE 문의 잘못된 컬럼 레벨 제약 조건 위치

CREATE TABLE 문 작성 시 컬럼 레벨 제약 조건(Column-level constraint)과 테이블 레벨 제약 조건(Table-level constraint)을 혼용하거나 문법적으로 잘못된 위치에 기술하면 에러가 발생합니다. 예를 들어 복합 기본 키(Composite Primary Key)를 컬럼 정의 라인에서 인라인으로 지정하려 하거나, DEFAULT 절 뒤에 잘못된 순서로 제약 조건을 배치하는 경우에 이 에러가 발생할 수 있습니다. Oracle의 문법 규칙에 따라 테이블 레벨 제약 조건은 반드시 모든 컬럼 정의 이후에 별도로 명시해야 합니다.

3. 뷰(View) 또는 서브쿼리에서 제약 조건 명시 시도

뷰(View) 생성 구문이나 서브쿼리 내에서 제약 조건을 정의하려 할 때에도 ORA-02253이 발생합니다. Oracle에서 뷰는 기본적으로 제약 조건을 가질 수 없으며(WITH CHECK OPTION 제외), 서브쿼리 내에서도 제약 조건 명시는 허용되지 않습니다. 개발자들이 테이블 생성 스크립트와 뷰 생성 스크립트를 혼동하거나 복사·붙여넣기 과정에서 이런 실수를 범하는 경우가 많습니다.


해결 방법

원인 1 해결: ALTER TABLE MODIFY 대신 ADD CONSTRAINT 사용

잘못된 예시 (ORA-02253 발생):

-- MODIFY 절에서 인라인 제약 조건 사용 시 에러 발생
ALTER TABLE employees
MODIFY (employee_id NUMBER(10) PRIMARY KEY);

올바른 예시:

-- 1단계: 컬럼 데이터 타입 변경은 MODIFY로
ALTER TABLE employees
MODIFY (employee_id NUMBER(10) NOT NULL);

-- 2단계: 제약 조건 추가는 ADD CONSTRAINT로 별도 수행
ALTER TABLE employees
ADD CONSTRAINT pk_employees PRIMARY KEY (employee_id);

UNIQUE 제약 조건 추가도 동일한 방식으로 처리합니다:

-- UNIQUE 제약 조건 별도 추가
ALTER TABLE employees
ADD CONSTRAINT uq_emp_email UNIQUE (email);

-- FOREIGN KEY 제약 조건 별도 추가
ALTER TABLE employees
ADD CONSTRAINT fk_dept_id
FOREIGN KEY (department_id)
REFERENCES departments (department_id);

원인 2 해결: CREATE TABLE 문법 교정

잘못된 예시 (복합 PK를 컬럼 레벨에서 정의):

-- 잘못된 방식: 복합 PK를 인라인으로 정의하려는 시도
CREATE TABLE order_items (
    order_id    NUMBER(10) PRIMARY KEY,  -- 단일 PK만 가능
    item_id     NUMBER(10) PRIMARY KEY,  -- 두 번째 PK 정의 불가
    quantity    NUMBER(5),
    unit_price  NUMBER(10,2)
);

올바른 예시 (테이블 레벨 제약 조건으로 분리):

-- 올바른 방식: 복합 PK는 테이블 레벨에서 정의
CREATE TABLE order_items (
    order_id    NUMBER(10)      NOT NULL,
    item_id     NUMBER(10)      NOT NULL,
    quantity    NUMBER(5)       NOT NULL,
    unit_price  NUMBER(10,2)    DEFAULT 0,
    -- 모든 컬럼 정의 이후 테이블 레벨 제약 조건 명시
    CONSTRAINT pk_order_items PRIMARY KEY (order_id, item_id),
    CONSTRAINT chk_quantity CHECK (quantity > 0),
    CONSTRAINT chk_price CHECK (unit_price >= 0)
);

원인 3 해결: 뷰 생성 시 제약 조건 제거

잘못된 예시 (뷰에 제약 조건 추가 시도):

-- 잘못된 방식: 뷰에 제약 조건 명시 (에러 발생)
CREATE VIEW emp_view AS
SELECT
    employee_id  NUMBER PRIMARY KEY,  -- 뷰에서 제약 조건 불가
    first_name,
    last_name
FROM employees;

올바른 예시:

-- 올바른 방식: 뷰에는 제약 조건 없이 정의
CREATE OR REPLACE VIEW emp_view AS
SELECT
    employee_id,
    first_name,
    last_name,
    department_id
FROM employees
WHERE department_id IS NOT NULL
WITH CHECK OPTION CONSTRAINT chk_emp_view;
-- WITH CHECK OPTION은 뷰에서 허용되는 유일한 제약 조건 형태

-- 제약 조건은 원본 테이블에 적용
ALTER TABLE employees
ADD CONSTRAINT pk_employees PRIMARY KEY (employee_id);

예방 방법

1. DDL 스크립트 작성 시 컬럼 정의와 제약 조건 정의를 명확히 분리하는 표준을 수립하세요

팀 전체의 DDL 작성 표준을 만들어 컬럼 정의 섹션과 제약 조건 정의 섹션을 항상 구분하여 작성하는 습관을 들이는 것이 중요합니다. 아래처럼 구조를 일관되게 유지하면 ORA-02253과 같은 문법 오류를 사전에 방지할 수 있습니다:

-- 권장 DDL 작성 표준 템플릿
CREATE TABLE 테이블명 (
    -- [섹션 1] 컬럼 정의
    col1  DATATYPE  [NOT NULL],
    col2  DATATYPE  [DEFAULT value] [NOT NULL],
    col3  DATATYPE,

    -- [섹션 2] 제약 조건 정의 (컬럼 정의 이후 일괄 명시)
    CONSTRAINT pk_테이블명    PRIMARY KEY (col1),
    CONSTRAINT uq_테이블명_col2 UNIQUE (col2),
    CONSTRAINT fk_테이블명_col3 FOREIGN KEY (col3) REFERENCES 참조테이블(참조컬럼),
    CONSTRAINT chk_테이블명   CHECK (col3 IS NOT NULL)
);

2. ALTER TABLE 작업 시 MODIFY와 ADD CONSTRAINT를 반드시 분리 실행하세요

운영 환경에서 스키마 변경 작업을 수행할 때는 컬럼 변경과 제약 조건 추가를 단일 트랜잭션 내에서도 반드시 별개의 DDL 문으로 작성하고 순서를 명확히 문서화해야 합니다. 제약 조건 추가 전에 반드시 기존 데이터의 유효성을 검증하는 스크립트를 포함시켜 ORA-02437(기본 키 위반) 또는 ORA-02291(무결성 제약 조건 위반) 등의 연쇄 에러도 방지해야 합니다.


관련 에러

  • ORA-02264: 이미 존재하는 제약 조건 이름을 사용할 때 발생합니다. 제약 조건 이름 중복 문제를 나타냅니다.
  • ORA-02437: PRIMARY KEY 제약 조건 추가 시 기존 데이터에 중복값이 있을 때 발생합니다.
  • ORA-02291: FOREIGN KEY 제약 조건 추가 시 참조 테이블에 해당 값이 없을 때 발생합니다.
  • ORA-00907: 괄호가 누락되었을 때 발생하는 문법 에러로, 제약 조건 문법 오류와 함께 자주 등장합니다.
  • ORA-01735: ALTER TABLE 구문에서 잘못된 옵션을 사용했을 때 발생하며, ORA-02253과 유사한 맥락에서 나타납니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기