개발 지식/[DBMS] Oracle

[Oracle] 제약 조건(4) - 외래 키(FOREIGN KEY)

devGSP 2022. 6. 26. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

외래 키(FOREIGN KEY)

 

설명

 

외래 키(이하 FK)는 다른 테이블의 열을 참조하여 존재하는 값만 입력할 수 있는 제약 조건이다.

예를 들어 한 학원에서 강의 시스템을 관리하는 데 '강의실' 테이블과 '강의' 테이블이 있다고 가정하자

 

const4_q1

 

각 '강의'마다 '강의실'이 배정해야 한다고 할 때, 한 직원이 '강의' 테이블의 '강의실코드' 컬럼에 실수로 'R05'를 기입하면 어떻게 될까?

다른 직원들이 그 자료를 참조했을 때 혼란을 겪게 될 것이다. '강의실코드'가 'R05'에 해당하는 강의실은 존재하지 않기 때문이다. FK는 이러한 상황을 방지해 줌으로서 데이터의 무결성에 기여하는 제약 조건이라고 할 수 있다.

 

 

문법

 

인라인(inline) 제약 조건 정의

 

-- 제약 조건 이름 미기입 시

CREATE TABLE [테이블 이름](

  (다른 열 정의 문법 생략),
  [열 이름] [열 자료형] REFERENCES [참조 테이블(참조할 열)]
);

 

-- 제약 조건 이름 기입 시

CREATE TABLE [테이블 이름](

  (다른 열 정의 문법 생략),
  [열 이름] [열 자료형] CONSTRAINT [제약 조건 이름] REFERENCES [참조 테이블(참조할 열)]
);

 

 

아웃오브라인(out-of-line) 제약 조건 정의


CREATE TABLE [테이블 이름](

  [지정할 열 이름] [지정할 열 자료형],
  (다른 열 정의 문법 생략),
  CONSTRAINT [제약 조건 이름] FOREIGN KEY [지정할 열 이름] REFERENCES [참조 테이블(참조할 열)]
);

 

 

사용 예시

CREATE TABLE TB_CLASSROOM (
  CROOM_IDX NUMBER(3) PRIMARY KEY,
  CROOM_INFO VARCHAR2(20)
);

-- TB_CLASSROOM 테이블의 CROOM_IDX를 FK로 사용하는 TB_CLASS 테이블 생성
CREATE TABLE TB_CLASS (
  CLASS_IDX NUMBER(3) PRIMARY KEY,
  CLASS_INFO VARCHAR2(100),
  CROOM_IDX NUMBER(3),
  CONSTRAINT FK_CLASS_CODE FOREIGN KEY(CROOM_IDX) REFERENCES TB_CLASSROOM(CROOM_IDX)
);

INSERT INTO TB_CLASSROOM (CROOM_IDX, CROOM_INFO)
     VALUES (101, '네이버반');
     
INSERT INTO TB_CLASSROOM (CROOM_IDX, CROOM_INFO)
     VALUES (102, '카카오반');
     
INSERT INTO TB_CLASSROOM (CROOM_IDX, CROOM_INFO)
     VALUES (103, '라인방');
     
INSERT INTO TB_CLASSROOM (CROOM_IDX, CROOM_INFO)
     VALUES (104, '쿠팡방');

const4_q2

 

4개의 강의실을 데이터를 생성했다. 이제 아래의 쿼리들을 실행해 보자.

 

INSERT INTO TB_CLASS (CLASS_IDX, CLASS_INFO, CROOM_IDX)
     VALUES (501, '알고리즘 강의', 101);
     
INSERT INTO TB_CLASS (CLASS_IDX, CLASS_INFO, CROOM_IDX)
     VALUES (502, '코딩테스트 풀이', 102);
     
INSERT INTO TB_CLASS (CLASS_IDX, CLASS_INFO, CROOM_IDX)
     VALUES (503, '웹 개발 필수 기본 지식', 103);
     
INSERT INTO TB_CLASS (CLASS_IDX, CLASS_INFO, CROOM_IDX)
     VALUES (504, '네트워크의 이해', 104);
     
SELECT * FROM TB_CLASS;

const4_q3

 

아래의 INSERT 쿼리도 실행해 보자.

 

INSERT INTO TB_CLASS (CLASS_IDX, CLASS_INFO, CROOM_IDX)
     VALUES (505, '물리적 경로와 가상 경로의 이해', 105);

const4_q4

 

TB_CLASSROOM 테이블의 CROOM_IDX 열이 105에 해당하는 레코드가 없으므로 INSERT가 실행되지 않고 오류가 발생한다.

반응형