Database
SQL - FOREIGN KEY (외래키)
CrackCo
2020. 7. 21. 19:46
테이블이 다른 테이블을 참조하여 데이터를 읽을 수 있도록 관계를 형성하는 외래키에 대해 알아봅시다.
-- COLUMN LEVEL
column datatype [CONSTRAINT constraint_name]
REFERENCES table (column1[, column2, ...] [ON DELETE CASCADE])
-- TABLE LEVEL
[CONSTRAINT constraint_name] FOREIGN KEY (column1[, column2, ...])
REFERENCES table (column1[, column2, ...] [ON DELETE CASCADE])
외래키로 열 또는 열의 집합을 지정할 수 있으며 동일 테이블 또는 다른 테이블 간 관계를 지정합니다
ON DELETE CASCADE 또는 SET NULL을 사용하여
부모 행이 삭제 될 시 해당 행의 삭제 또는 NULL 값으로 변할 지 정할 수 있습니다.
🔥부모 행: 정보를 주는 행, 자식 행: 정보를 받는 행
두 개의 테이블을 만들어보도록 하겠습니다.
CREATE TABLE DEPT_P(
DEPTNO NUMBER(2)
CONSTRAINT DEPT_C_DEPTNO_PK PRIMARY KEY,
DNAME VARCHAR2(10),
LOC VARCHAR2(10)
);
CREATE TABLE EMP_C(
EMPNO NUMBER(4)
CONSTRAINT EMP_C_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10),
SAL NUMBER(10),
DEPTNO NUMBER(2) -- DEPT_P를 참조하는 외래키
CONSTRAINT EMP_C_DEPTNO_FK
REFERENCES DEPT_P(DEPTNO)
);
EMP_C 테이블에서 DEPTNO 컬럼은 DEPT_P의 DEPTNO 컬럼을 기준으로 참조할 수 있게 하였습니다.
정보를 빼오는 테스트를 하기 전에 DEPT_P 에 약간의 정보를 채워보겠습니다.
INSERT INTO DEPT_P VALUES(10, '인사', '서울');
INSERT INTO DEPT_P VALUES(20, '경리', '부산');
INSERT INTO DEPT_P VALUES(30, '관리', '대구');
현재 10번, 20번, 30번 부서가 있는 상황입니다.
제약 조건이 잘 성립되었는지 확인하기 위해 부서에 없는 40번 부서를 가진 사원을 입력해보겠습니다.
INSERT INTO EMP_C
VALUES(1111, 'WOOZYA', 2000, 40);
부모 테이블(DEPT_P)에 제약 조건이 걸려있는 40번의 참조 대상인 DEPTNO가 존재하지 않아
부모 키가 없다는 오류 메시지와 함께 수행이 되지 않는 모습을 볼 수 있습니다.