본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

데이터베이스 참조 무결성

IT위키

Referential Integrity

참조 무결성은 데이터베이스에서 외래 키(foreign key)가 다른 테이블의 주 키(primary key)와 일관되게 연결되어 있어야 함을 보장하는 규칙이다. 이는 데이터 간의 관계가 올바르게 형성되고, 데이터의 무결성을 유지하는 데 필수적인 요소이다.

  • 참조 무결성은 데이터베이스의 데이터 간의 관계를 명확히 하여 데이터의 일관성을 유지하는 데 중요한 역할을 한다. 이를 통해 잘못된 데이터 입력이나 무결성 오류를 방지하고, 데이터의 신뢰성을 높일 수 있다.

의미 및 규칙

편집 원본 편집

외래 키는 한 테이블의 속성이 다른 테이블의 주 키를 참조하는 경우에 설정된다. 이를 통해 두 테이블 간의 관계를 정의하며, 외래 키는 반드시 참조하는 주 키가 존재해야 한다.

  • 외래 키로 설정된 값은 반드시 참조하는 테이블의 주 키에 존재해야 한다. 즉, 외래 키가 NULL이 아닌 경우, 해당 값은 반드시 참조 테이블에 있어야 한다.

규칙을 준수하기 위한 제약조건은 아래 참고

참조 무결성 제약조건

편집 원본 편집

Referential Integrity Constraint

예를 들어, 고객 테이블과 주문 테이블이 있다고 가정하자. 고객 테이블의 고객 ID가 주 키라면, 주문 테이블의 고객 ID는 외래 키로 설정될 수 있다. 이 경우, 주문 테이블의 고객 ID는 반드시 고객 테이블에 존재하는 고객 ID여야 하며, 고객이 삭제될 경우 해당 고객의 주문을 어떻게 처리할지를 정의해야 한다.

참조 무결성이 유지되기 위한 제약조건은 아래와 같이 4가지로 구분된다.

기능 구분
Restrict
  • 부모 테이블의 참조 대상 키가 삭제 또는 변경되는 것을 불허
  • 자식 테이블의 참조값을 변경하는 경우, 부모 테이블에 있는 참조 대상 키가 있는 경우만 허용
Cascade 부모 테이블의 참조 대상 키가 삭제되면 자식 테이블의 참조 튜플 삭제
Nullify 부모 테이블의 참조 대상 키가 삭제되면 자식 테이블의 참조값을 Null로 변경
Default 부모 테이블의 참조 대상 키가 삭제되면 미리 정의한 Default 값으로 변경

연산별 위배 여부

편집 원본 편집

직원(사번, 이름, 부서번호) 테이블의 부서번호가 부서(부서번호, 부서이름) 테이블의 기본키를 외래 키로 참조하고, 부서에 01·02·03 이 있으며 직원 230301 이 부서 03 을 참조한다고 하자.

연산 예 결과
참조하는(자식) 테이블에 INSERT 직원에 (230304, D, 04) 추가. 부서에 04 가 없다 참조 무결성 위배. 기본키(사번)는 정상이라 개체 무결성과는 관계없다
참조하는(자식) 테이블에서 DELETE 직원 (230101, A, 01) 삭제 위배 없음
참조되는(부모) 테이블에 INSERT 부서에 (04, 정보통신과) 추가 위배 없음(기본키가 중복·NULL 이 아니므로)
참조되는(부모) 테이블에서 DELETE 부서 (03, 기획과) 삭제. 직원 230301 이 참조 중 참조 무결성 위배(RESTRICT 면 거부된다. CASCADE·SET NULL 로 정의했으면 자식 행이 함께 삭제되거나 NULL 이 된다)
기본키가 NULL 이거나 중복인 행 INSERT 부서에 (03, 총무과) 추가 개체 무결성 위배 → 데이터베이스 개체 무결성

외래 키를 정의할 때 부모 쪽 행이 삭제(ON DELETE)·변경(ON UPDATE)되면 자식 쪽을 어떻게 할지 지정한다.

옵션 동작
CASCADE 부모 행이 삭제되면 자식 행도 삭제, 부모 키가 바뀌면 자식의 외래 키도 같은 값으로 바뀐다
SET NULL 자식의 외래 키를 NULL 로 바꾼다. 외래 키가 NOT NULL 이면 쓸 수 없다
SET DEFAULT 자식의 외래 키를 열의 DEFAULT 값으로 바꾼다
RESTRICT / NO ACTION 자식 행이 참조하고 있으면 부모 행의 삭제·변경을 거부한다
CREATE TABLE 부서 (
    ...,
    관리자번호 INT NOT NULL DEFAULT 1,
    FOREIGN KEY (관리자번호) REFERENCES 직원(직원번호)
        ON DELETE SET DEFAULT   -- 관리자인 직원이 삭제되면 디폴트값으로
        ON UPDATE CASCADE       -- 직원번호가 바뀌면 관리자번호도 같이 변경
);
  • 관리자번호가 NOT NULL 이므로 삭제 시 SET NULL 은 쓸 수 없고, 디폴트값으로 바꾸라는 요구에는 SET DEFAULT 가 맞다