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

ORA-02250
2026년 08월 13일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-02250 missing or invalid constraint name 는?

ORA-02250 에러는 Oracle 데이터베이스에서 제약 조건(Constraint)을 생성하거나 수정할 때, 제약 조건의 이름이 누락되었거나 잘못된 형식으로 지정되었을 때 발생하는 에러입니다. 주로 CREATE TABLE, ALTER TABLE 구문에서 CONSTRAINT 키워드 뒤에 유효하지 않은 이름을 사용하거나 아예 이름을 생략했을 때 Oracle 파서가 이를 감지하여 발생시킵니다. 이 에러는 DDL(Data Definition Language) 작업 시 빈번하게 발생하며, 올바른 명명 규칙과 문법을 준수하지 않을 경우 반복적으로 마주치게 됩니다.


주요 발생 원인

1. 제약 조건 이름에 예약어(Reserved Word) 또는 특수문자 사용

Oracle에서 제약 조건 이름은 일반 식별자 규칙을 따라야 합니다. 즉, 이름은 문자로 시작해야 하고, 특수문자(@, #, $ 제외)나 Oracle 예약어를 사용할 수 없습니다. 예를 들어, CONSTRAINT SELECT_PK처럼 SELECT라는 예약어를 이름으로 사용하거나, CONSTRAINT 1ST_PK처럼 숫자로 시작하는 이름을 지정하면 ORA-02250 에러가 발생합니다.

2. CONSTRAINT 키워드 뒤에 이름 없이 바로 제약 조건 유형 기술

CONSTRAINT 키워드를 명시한 이후에는 반드시 제약 조건 이름이 와야 하는데, 이름을 생략하고 바로 PRIMARY KEY, UNIQUE, FOREIGN KEY 등의 제약 조건 유형을 기술하는 경우 에러가 발생합니다. 이는 특히 타 DBMS(MySQL, PostgreSQL 등)에서 Oracle로 마이그레이션하는 과정에서 문법 차이를 인지하지 못해 자주 발생하는 실수입니다.

3. 이름에 허용되지 않는 공백 또는 따옴표 처리 오류

제약 조건 이름 내에 공백이 포함되어 있거나, 큰따옴표(")로 감싸야 할 특수한 이름을 작은따옴표(')로 처리하는 경우에도 이 에러가 발생합니다. Oracle은 공백이 포함된 식별자를 큰따옴표로 감싸는 방식(Quoted Identifier)을 지원하지만, 이를 혼동하여 잘못 작성하면 파서가 이름을 정상적으로 인식하지 못하여 ORA-02250이 발생하게 됩니다.


해결 방법

원인 1 해결: 예약어 및 특수문자 제거

예약어나 특수문자를 사용하지 않고, 알파벳 문자로 시작하는 유효한 이름으로 변경합니다.

-- 잘못된 예: 예약어 사용
ALTER TABLE employees
ADD CONSTRAINT SELECT_PK PRIMARY KEY (employee_id);
-- ORA-02250 발생

-- 올바른 예: 유효한 제약 조건 이름 사용
ALTER TABLE employees
ADD CONSTRAINT PK_EMPLOYEES PRIMARY KEY (employee_id);

-- 잘못된 예: 숫자로 시작하는 이름
CREATE TABLE departments (
    dept_id    NUMBER,
    dept_name  VARCHAR2(100),
    CONSTRAINT 1ST_DEPT_PK PRIMARY KEY (dept_id)
);
-- ORA-02250 발생

-- 올바른 예
CREATE TABLE departments (
    dept_id    NUMBER,
    dept_name  VARCHAR2(100),
    CONSTRAINT PK_DEPARTMENTS PRIMARY KEY (dept_id)
);

원인 2 해결: CONSTRAINT 키워드 이후 이름 명시

CONSTRAINT 키워드를 사용했다면 반드시 이름을 명시하거나, 이름 없이 제약 조건을 정의하려면 CONSTRAINT 키워드 자체를 생략합니다.

-- 잘못된 예: CONSTRAINT 키워드 후 이름 없음
CREATE TABLE orders (
    order_id   NUMBER,
    customer_id NUMBER,
    CONSTRAINT PRIMARY KEY (order_id)
);
-- ORA-02250 발생

-- 올바른 예 1: 이름 명시
CREATE TABLE orders (
    order_id    NUMBER,
    customer_id NUMBER,
    CONSTRAINT PK_ORDERS PRIMARY KEY (order_id)
);

-- 올바른 예 2: CONSTRAINT 키워드 자체 생략 (Oracle이 자동으로 시스템 이름 부여)
CREATE TABLE orders (
    order_id    NUMBER,
    customer_id NUMBER,
    PRIMARY KEY (order_id)
);

-- ALTER TABLE에서의 올바른 사용
ALTER TABLE orders
ADD CONSTRAINT FK_ORDERS_CUSTOMER
    FOREIGN KEY (customer_id)
    REFERENCES customers (customer_id);

원인 3 해결: 따옴표 처리 수정

공백이 포함된 이름은 큰따옴표로 감싸며, 가능하면 공백 없이 언더스코어(_)를 활용한 이름을 권장합니다.

-- 잘못된 예: 작은따옴표 사용
ALTER TABLE employees
ADD CONSTRAINT 'EMP UNIQUE EMAIL' UNIQUE (email);
-- ORA-02250 발생

-- 올바른 예 1: 큰따옴표 사용 (Quoted Identifier)
ALTER TABLE employees
ADD CONSTRAINT "EMP UNIQUE EMAIL" UNIQUE (email);

-- 권장 예: 공백 대신 언더스코어 사용 (실무 권장)
ALTER TABLE employees
ADD CONSTRAINT UQ_EMP_EMAIL UNIQUE (email);

-- 현재 생성된 제약 조건 확인
SELECT constraint_name, constraint_type, table_name, status
FROM user_constraints
WHERE table_name = 'EMPLOYEES'
ORDER BY constraint_type;

예방 방법

1. 명명 규칙(Naming Convention) 표준화 및 문서화

팀 또는 조직 차원에서 제약 조건 명명 규칙을 사전에 정의하고 모든 개발자가 이를 준수하도록 합니다. 예를 들어, PK_테이블명, FK_테이블명_참조테이블명, UQ_테이블명_컬럼명, CK_테이블명_컬럼명 형식을 표준으로 정하면 예약어 충돌이나 잘못된 문자 사용을 사전에 방지할 수 있습니다. 또한, DDL 스크립트를 운영 환경에 적용하기 전 반드시 개발 또는 테스트 환경에서 먼저 검증하는 프로세스를 의무화하는 것이 중요합니다.

-- 권장 명명 규칙 예시
-- PK: PK_테이블명
-- FK: FK_자식테이블_부모테이블
-- UQ: UQ_테이블명_컬럼명
-- CK: CK_테이블명_조건명

CREATE TABLE employees (
    employee_id NUMBER         NOT NULL,
    email       VARCHAR2(200)  NOT NULL,
    dept_id     NUMBER,
    salary      NUMBER,
    CONSTRAINT PK_EMPLOYEES        PRIMARY KEY (employee_id),
    CONSTRAINT UQ_EMP_EMAIL        UNIQUE (email),
    CONSTRAINT FK_EMP_DEPT         FOREIGN KEY (dept_id) REFERENCES departments(dept_id),
    CONSTRAINT CK_EMP_SALARY       CHECK (salary > 0)
);

2. DDL 변경 전 딕셔너리 조회를 통한 사전 검증

새로운 제약 조건을 추가하기 전에 반드시 데이터 딕셔너리(USER_CONSTRAINTS, ALL_CONSTRAINTS)를 조회하여 이름 중복 여부를 확인하고, 사용하려는 이름이 Oracle 예약어 목록과 충돌하지 않는지 사전에 점검하는 습관을 가져야 합니다.

-- 특정 테이블의 기존 제약 조건 목록 확인
SELECT constraint_name,
       constraint_type,
       search_condition,
       status,
       validated
FROM   user_constraints
WHERE  table_name = 'EMPLOYEES';

-- 스키마 전체 제약 조건 이름 중복 확인
SELECT constraint_name, COUNT(*)
FROM   user_constraints
GROUP  BY constraint_name
HAVING COUNT(*) > 1;

관련 에러

  • ORA-02264: 이미 존재하는 제약 조건 이름을 다시 사용하려 할 때 발생합니다 (name already used by an existing constraint).
  • ORA-02266: 활성화된 외래 키(Foreign Key)에 의해 참조되고 있는 테이블을 수정하려 할 때 발생합니다.
  • ORA-00904: 잘못된 식별자 이름으로 인해 발생하는 에러로, 제약 조건 이름 오류와 유사한 맥락에서 자주 함께 발생합니다.
  • ORA-02231: ALTER TABLE 구문에서 잘못된 옵션을 사용할 때 발생하며, DDL 문법 오류 계열에 속합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기