💡 핵심 인사이트
참조 무결성은 두 테이블이 부모-자식 관계로 묶여있을 때, **"자식 테이블의 외래 키(FK)는 반드시 부모 테이블의 기본 키(PK)에 존재하는 값만 베껴 써야 한다"**는 무결성 규칙입니다.
유령 부모를 가리키는 미아(Orphan) 데이터가 생기는 것을 철저히 차단하여 데이터의 족보를 지켜냅니다.
Ⅰ. 참조 무결성의 정의와 주체
개체 무결성이 한 테이블 '내부'의 짱(PK)을 지키는 규칙이라면, **참조 무결성(Referential Integrity)**은 테이블과 테이블 '사이'의 끈을 이어주는 **외래 키(Foreign Key, FK)**를 감시하는 규칙입니다.
A 테이블(자식)의 외래 키가 B 테이블(부모)의 기본 키를 가리킨다면, 이 끈이 끊어지거나 엉뚱한 곳을 가리키면 안 됩니다.
Ⅱ. 참조 무결성을 지키기 위한 강제 룰
DB 엔진은 외래 키를 보호하기 위해 삽입, 삭제 시 치열한 방어전을 펼칩니다.
1. 엉뚱한 자식의 삽입 금지 (No Orphan INSERT)
- 부모 테이블(
부서)에 10번, 20번 부서만 존재합니다. - 자식 테이블(
사원)에 신입사원을 INSERT 하면서 부서번호를 30번으로 적어 넣으려 합니다. - 결과: 세상에 존재하지 않는 30번 부서를 참조하려 했으므로, 참조 무결성 위반으로 데이터가 튕겨 나갑니다. (반드시 부모에 있는 10, 20 중 하나만 써야 함)
2. 외래 키의 NULL 허용 (예외 조항)
- 신입사원이 아직 부서 발령을 받지 못해 부서번호를 **NULL(비워둠)**로 비워두고 삽입하려 합니다.
- 결과: 이것은 허용됩니다. 개체 무결성(PK)은 NULL이 안 되지만, 참조 무결성(FK)은 **"부모에 있는 값을 쓰거나, 아예 끈을 묶지 말거나(NULL)"**의 두 가지 상태를 합법으로 봅니다.
3. 부모의 무책임한 삭제/수정 금지 (RESTRICT)
- 자식(
사원)들이 10번 부서를 참조하며 잘 다니고 있는데, 부모(부서) 테이블에서 10번 부서를 DROP(삭제)해 버리려 합니다. - 결과: 부모가 날아가면 10번 부서를 가리키던 자식들의 외래 키는 허공을 맴도는 고아(Orphan) 데이터가 됩니다. 따라서 DB는 **"자식이 참조하고 있는 부모 데이터는 삭제하거나 수정할 수 없다(RESTRICT 옵션)"**며 에러를 발생시킵니다.
Ⅲ. 부모 데이터를 변경할 때의 해결책 (CASCADE)
부서 번호를 부득이하게 변경하거나 삭제해야 할 때, 에러를 내지 않고 유연하게 대처하기 위한 옵션들이 있습니다. (테이블 생성 시 FK 제약조건에 추가함)
- CASCADE (연쇄 폭발): 부모 테이블에서 10번 부서가 삭제되면, DB가 알아서 자식 테이블로 쫓아가 **10번 부서에 속한 사원들의 데이터도 함께 연쇄적으로 삭제(혹은 수정)**해 버립니다.
- SET NULL: 부모의 10번 부서가 삭제되면, 자식들을 죽이는 대신 해당 사원들의 부서번호(FK) 컬럼을 강제로 비워버립니다(NULL). (무소속 사원이 됨).
- SET DEFAULT: 부모가 삭제되면 자식들의 FK를 미리 정해둔 기본값(예: 0번 임시대기 부서)으로 일괄 변경합니다.
📢 섹션 요약 비유: 참조 무결성은 은행의 **'보증인 시스템'**입니다. 대출자(자식 FK)가 대출을 받으려면 반드시 서류에 진짜 존재하는 부자 지인(부모 PK)의 이름을 적어야 합니다. 은행(DB)은 서류에 적힌 보증인이 가짜 유령(없는 값)이면 대출을 거부하며, 빚이 다 청산되기 전에는 보증인이 마음대로 해외로 도망가거나 이름을 바꾸는 것(부모 데이터 삭제/수정)을 철저하게 금지합니다.