Cracking Code

SQL - FOREIGN KEY (외래키) 본문

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가 존재하지 않아

부모 키가 없다는 오류 메시지와 함께 수행이 되지 않는 모습을 볼 수 있습니다.

'Database' 카테고리의 다른 글

SQL - ALTER TABLE  (0) 2020.07.22
SQL - DROP TABLE  (0) 2020.07.21
SQL - CHECK  (0) 2020.07.21
SQL - UNIQUE KEY (유니크 키)  (0) 2020.07.21
SQL - PRIMARY KEY (기본키)  (0) 2020.07.21
Comments