외래키(Foreign Key)는 한 테이블의 컬럼이 다른 테이블의 기본키 또는 유니크 키를 참조하도록 설정하는 제약 조건입니다. 외래키는 테이블 간의 관계를 정의하며, 데이터의 무결성을 유지하는 데 중요한 역할을 합니다.
주요 특징
자식 테이블과 부모 테이블
자식 테이블: 외래키를 가진 테이블입니다.
부모 테이블: 외래키가 참조하는 기본키를 가진 테이블입니다.
참조 무결성 유지
: 자식 테이블의 외래키는 부모 테이블의 기본키 또는 유니크 키의 값을 참조해야 합니다. 즉, 자식 테이블에 입력할 수 있는 값은 반드시 부모 테이블에 존재해야 합니다.
데이터 타입 일치
:참조하는 외래키 컬럼과 참조받는 기본키 또는 유니크 키 컬럼의 데이터 타입이 일치해야 합니다.
삭제 옵션
ON DELETE CASCADE: 부모 테이블의 데이터가 삭제되면 자식 테이블의 관련 데이터도 자동으로 삭제됩니다.
ON DELETE SET NULL: 부모 테이블의 데이터가 삭제되면 자식 테이블의 외래키 컬럼 값이 NULL로 설정됩니다.
Foreign Key 선언 방법
외래키를 선언하는 방법은 다음과 같습니다:
예제: daddy와 daughter 테이블
sql 코드 :
-- 부모 테이블 생성
CREATE TABLE daddy (
idx NUMBER(10),
mid NUMBER(10) PRIMARY KEY -- 기본키 정의
);
-- 자식 테이블 생성
CREATE TABLE daughter (
idx NUMBER(10) PRIMARY KEY,
mid NUMBER(10),
CONSTRAINT fk_da FOREIGN KEY (mid) -- 외래키 제약 조건
REFERENCES daddy(mid) -- 부모 테이블과의 참조 관계
ON DELETE CASCADE -- 부모 테이블의 행 삭제 시 자식 테이블의 관련 행도 삭제
);
부모 테이블 (daddy):
mid 컬럼이 기본키로 설정되어 있습니다.
자식 테이블 (daughter):
mid 컬럼이 외래키로 설정되어 있으며, daddy 테이블의 mid 컬럼을 참조합니다.
ON DELETE CASCADE 옵션을 사용하여 부모 테이블의 데이터 삭제 시 자식 테이블의 관련 데이터도 삭제됩니다.
데이터 삽입 및 삭제 예제
sql 코드 :
-- 부모 테이블에 데이터 삽입
INSERT INTO daddy VALUES (1, 10);
INSERT INTO daddy VALUES (2, 20);
-- 자식 테이블에 데이터 삽입
INSERT INTO daughter VALUES (100, 10);
INSERT INTO daughter VALUES (101, 10);
INSERT INTO daughter VALUES (102, 10);
INSERT INTO daughter VALUES (200, 20);
INSERT INTO daughter VALUES (201, 20);
-- 부모 테이블의 데이터 조회
SELECT * FROM daddy;
-- 자식 테이블의 데이터 조회
SELECT * FROM daughter;
-- LEFT OUTER JOIN을 사용한 조회 (부모 테이블의 모든 데이터를 포함)
SELECT *
FROM daddy d
LEFT OUTER JOIN daughter d2
ON d.mid = d2.mid;
-- 부모 테이블에서 데이터 삭제
DELETE FROM daddy WHERE idx = 1;
-- 삭제 후 자식 테이블의 데이터 조회
SELECT * FROM daughter;
삭제 옵션
ON DELETE CASCADE:
부모 테이블의 데이터가 삭제될 때 자식 테이블의 관련 데이터도 자동으로 삭제됩니다.
ON DELETE SET NULL:
부모 테이블의 데이터가 삭제되면 자식 테이블의 외래키 컬럼 값이 NULL로 설정됩니다. 이 경우 자식 테이블의 데이터는 유지되지만 외래키 값은 NULL로 변경됩니다.
sql 코드
-- 자식 테이블 생성 시 ON DELETE SET NULL 사용
CREATE TABLE daughter_with_null (
idx NUMBER(10) PRIMARY KEY,
mid NUMBER(10),
CONSTRAINT fk_da_with_null FOREIGN KEY (mid)
REFERENCES daddy(mid)
ON DELETE SET NULL
);
ON DELETE SET NULL: 부모 테이블에서 mid가 삭제되면 자식 테이블의 mid 값이 NULL로 설정됩니다.