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

ORA-02270
2026년 08월 15일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-02270 no matching unique or primary key for this column-list 는?

ORA-02270은 외래 키(Foreign Key) 제약 조건을 생성할 때, 참조하려는 부모 테이블의 컬럼 목록에 해당하는 기본 키(Primary Key) 또는 고유 키(Unique Key)가 존재하지 않을 경우 발생하는 에러입니다. Oracle은 외래 키가 반드시 부모 테이블의 유일성이 보장된 컬럼(들)을 참조해야 한다는 규칙을 엄격히 적용합니다. 이 에러는 DDL 작업 중 테이블 생성, 제약 조건 추가, 또는 기존 테이블 변경 시 자주 마주치게 됩니다.


주요 발생 원인

1. 참조 대상 컬럼에 Primary Key 또는 Unique Key가 없는 경우

외래 키는 반드시 부모 테이블에서 Primary Key 또는 Unique Constraint가 정의된 컬럼만 참조할 수 있습니다. 참조 대상 컬럼에 단순 인덱스만 존재하거나 제약 조건이 전혀 없는 경우 ORA-02270이 발생합니다. 실무에서 가장 흔하게 발생하는 원인으로, 테이블 설계 단계에서 부모 테이블의 키 정의를 누락했을 때 주로 나타납니다.

2. 복합 외래 키(Composite Foreign Key)의 컬럼 순서 또는 구성이 불일치하는 경우

복합 키를 참조할 때 외래 키의 컬럼 목록이 부모 테이블의 복합 Primary Key 또는 Unique Key의 컬럼 구성 및 순서와 정확히 일치하지 않으면 에러가 발생합니다. 컬럼의 수, 데이터 타입, 순서 모두가 완벽히 맞아야 하며, 하나라도 어긋나면 Oracle은 매칭되는 키를 찾지 못해 ORA-02270을 반환합니다.

3. 참조 대상 테이블 또는 컬럼명 오타 및 스키마 불일치

참조하려는 테이블 이름이나 컬럼 이름에 오타가 있거나, 다른 스키마(Schema)의 테이블을 참조할 때 스키마 명칭을 잘못 지정한 경우에도 이 에러가 발생합니다. Oracle이 해당 테이블 또는 컬럼을 찾지 못하거나, 찾더라도 그 컬럼에 적합한 키 제약 조건이 없으면 동일한 에러를 반환합니다.


해결 방법

원인 1 해결: 부모 테이블에 Primary Key 또는 Unique Key 추가

먼저 부모 테이블의 키 현황을 확인합니다.

-- 부모 테이블의 제약 조건 확인
SELECT constraint_name, constraint_type, column_name
FROM user_cons_columns uc
JOIN user_constraints c ON uc.constraint_name = c.constraint_name
WHERE c.table_name = 'PARENT_TABLE'
  AND c.constraint_type IN ('P', 'U')
ORDER BY c.constraint_type, uc.position;

Primary Key가 없다면 다음과 같이 추가합니다.

-- 부모 테이블에 Primary Key 추가
ALTER TABLE parent_table
ADD CONSTRAINT pk_parent_table PRIMARY KEY (parent_id);

-- 이후 자식 테이블에 외래 키 생성
ALTER TABLE child_table
ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id)
REFERENCES parent_table(parent_id);

Unique Key를 통한 참조가 필요한 경우에는 아래와 같이 처리합니다.

-- Unique 제약 조건 추가 후 외래 키 생성
ALTER TABLE parent_table
ADD CONSTRAINT uq_parent_email UNIQUE (email);

ALTER TABLE child_table
ADD CONSTRAINT fk_child_email
FOREIGN KEY (email)
REFERENCES parent_table(email);

원인 2 해결: 복합 키 컬럼 순서 및 구성 맞추기

-- 잘못된 예: 복합 키 컬럼 순서 불일치
-- 부모 테이블 복합 PK: (dept_id, emp_type)
-- 아래처럼 순서를 바꾸면 ORA-02270 발생
ALTER TABLE child_table
ADD CONSTRAINT fk_wrong
FOREIGN KEY (emp_type, dept_id)          -- 순서 틀림!
REFERENCES parent_table(emp_type, dept_id);

-- 올바른 예: 복합 키 컬럼 순서 일치
ALTER TABLE child_table
ADD CONSTRAINT fk_correct
FOREIGN KEY (dept_id, emp_type)          -- 부모 PK 순서와 동일
REFERENCES parent_table(dept_id, emp_type);

부모 테이블의 복합 키 순서를 사전에 반드시 확인하세요.

-- 복합 키 컬럼 순서 확인 쿼리
SELECT ucc.constraint_name,
       ucc.column_name,
       ucc.position,
       uc.constraint_type
FROM user_cons_columns ucc
JOIN user_constraints uc ON ucc.constraint_name = uc.constraint_name
WHERE uc.table_name = 'PARENT_TABLE'
  AND uc.constraint_type IN ('P', 'U')
ORDER BY ucc.constraint_name, ucc.position;

원인 3 해결: 테이블명 및 스키마 확인

-- 테이블 존재 여부 및 스키마 확인
SELECT owner, table_name
FROM all_tables
WHERE table_name = 'PARENT_TABLE';

-- 다른 스키마 참조 시 스키마명 명시
ALTER TABLE scott.child_table
ADD CONSTRAINT fk_cross_schema
FOREIGN KEY (dept_id)
REFERENCES hr.parent_table(dept_id);   -- 스키마명 명시 필수

-- 해당 스키마의 제약 조건 확인
SELECT owner, constraint_name, constraint_type, table_name
FROM all_constraints
WHERE table_name = 'PARENT_TABLE'
  AND constraint_type IN ('P', 'U')
  AND owner = 'HR';

예방 방법

1. 테이블 생성 순서와 키 제약 조건 정의를 DDL 스크립트에 표준화하기

부모 테이블을 항상 자식 테이블보다 먼저 생성하고, Primary Key를 테이블 생성 시점에 반드시 정의하는 조직 내 DDL 표준을 수립하세요. 또한 외래 키를 추가하기 전에 반드시 ALL_CONSTRAINTS 또는 USER_CONSTRAINTS 뷰를 통해 부모 테이블의 키 제약 조건이 존재하는지 확인하는 검증 스크립트를 배포 프로세스에 포함시키는 것이 좋습니다.

-- 배포 전 부모 테이블 키 제약 조건 존재 여부 사전 검증 예시
SELECT COUNT(*)
FROM user_constraints
WHERE table_name = 'PARENT_TABLE'
  AND constraint_type IN ('P', 'U');
-- 결과가 0이면 외래 키 생성 전에 키 추가 필요

2. ERD(Entity-Relationship Diagram) 기반 설계 및 리뷰 프로세스 도입

데이터베이스 설계 단계에서 ERD 툴(예: Oracle SQL Developer Data Modeler, ERwin 등)을 활용하여 테이블 간 관계와 키 제약 조건을 시각적으로 확인하고, DDL 생성 전 리뷰 단계를 의무화하세요. 자동 생성된 DDL 스크립트를 검토할 때는 외래 키 참조 컬럼이 실제 부모 테이블의 Primary Key 또는 Unique Key와 정확히 매핑되는지 체크리스트 방식으로 검증하면 ORA-02270과 같은 제약 조건 관련 에러를 사전에 차단할 수 있습니다.


관련 에러

  • ORA-02266: 테이블에 활성화된 외래 키가 존재하여 부모 테이블 삭제 또는 Truncate가 불가능할 때 발생합니다.
  • ORA-02291: 외래 키 값이 부모 테이블에 존재하지 않을 때(참조 무결성 위반) INSERT 또는 UPDATE 시 발생합니다.
  • ORA-02292: 자식 테이블에 참조 데이터가 존재하는 부모 레코드를 DELETE하려 할 때 발생합니다.
  • ORA-00942: 참조하려는 테이블 자체가 존재하지 않거나 접근 권한이 없을 때 발생하며, ORA-02270과 함께 외래 키 생성 실패의 주요 원인 중 하나입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기