관계형 DB 무결성 제약조건

October 11, 2023


무결성이란?

무결성은 데이터베이스에 저장된 정보가 현실 세계의 실제 값과 정확하게 일치함을 보장하는 중요한 개념입니다.

무결성 제약조건

무결성 제약조건은 데이터베이스 내에 저장되는 정보가 정확하고 신뢰할 수 있도록 하기 위해 설정되는 규칙이라고 볼 수 있습니다.

분류 설명
개체 무결성 기본 키는 NULL값이나 중복된 값을 가질 수 없음
참조 무결성 외래 키 값은 NULL이거나 참조 릴레이션의 기본 키 값과 동일해야 함
(즉, 릴레이션은 참조가 가능한 외래키 값만을 가질 수 있다는 규정)
도메인 무결성 주어진 속성 값이 정의된 도메인에 속한 값이어야 함
SQL에서 CHECK 문에 의해 표현
사용자 정의 무결성 속성 값들이 사용자가 정의한 제약조건에 만족되어야 한다는 규정
NULL 무결성 릴레이션의 특정 속성 값이 NULL이 될 수 없도록 하는 규정
고유 무결성 릴레이션의 특정 속성에 대해 각 튜플이 갖는 속성값들이 서로 달라야 한다는 규정
즉 속성값이 유일해야 함
키 무결성 하나의 릴레이션에는 적어도 하나의 키가 존재해야 한다는 규정
관계 무결성 릴레이션에 어느 한 튜플의 삽입 가능 여부
또는 한 릴레이션과 다른 릴레이션의 튜플들 사이의 관계에 대한 적절성 여부를 지정한 규정
  • 도메인 무결성 제한 예시

    CREATE TABLE STUDENT (
        id      INT PRIMARY KEY,
        grade   NUMBER(3, 1) CHECK (grade BETWEEN 0.0 AND 4.5)
    );
  • 기존에 선언된 제약 조건을 활성화 / 비활성화

    ALTER TABLE STUDENT DISABLE CONSTRAINT ST_Sname
    ALTER TABLE STUDENT ENABLE CONSTRAINT ST_Sname

    CONSTRAINT 뒤에 제약 조건명을 지정할 수 있습니다.

변경시 확인하는 무결성

employee-department

DEPARTMENT의 주키를 EMPLOYEE 테이블에서 외래키 dept_id로 참조해 다대일 관계를 맺고 있습니다.

INSERT하는 경우

릴레이션에 새로 삽입되는 데이터는 도메인, , 엔티티 무결성 제약조건을 위배할 수 있습니다.

개체 무결성을 지키기 위해 기본키가 NULL이거나 중복인지 확인해야 합니다.

참조되는 테이블인 DEPARTMENT은 레코드 삽입시 참조 무결성 제약조건은 위배되지 않습니다. 하지만 위의 제약 조건을 확인해야 합니다.

DEPARTMENT 테이블을 외래키로 참조하는 릴레이션인 EMPLOYEE의 경우에는 위의 제약조건 뿐만 아니라 참조 무결성 제약조건도 위배할 가능성이 있습니다. 그래서 이 조건들을 위배하는 삽입 연산은 DBMS가 거절하여 무결성을 유지합니다.

UPDATE하는 경우

만약 기본 키나 외래 키를 수정하려 하면 참조 무결성에 위배되는지 확인합니다.

또는, 기본 키나 외래 키 이외의 애트리뷰트 값을 수정하고자 하면 참조 무결성 제약조건을 위배하지 않아서 나머지 제약조건을 만족하는지만 검사합니다.

ON UPDATE

Oracle은 ON UPDATE 옵션 설정이 불가능합니다. 따라서 Trigger를 사용해야 합니다.

Trigger 정리

DELETE하는 경우

삭제하는 경우, 참조하는 테이블인 자식 테이블을 따로 검사하지 않아도 됩니다. 하지만 참조당하는 테이블인 부모 테이블의 레코드를 삭제하려고 하는 경우, 해당 레코드의 기본 키가 다른 테이블에서 참조하고 있는지 확인해야 합니다.

즉, 참조 무결성을 위배하는지 확인 후에 삭제할 수 있습니다.

ON DELETE

USER-COMMENT

USER은 여러 COMMENT를 생성할 수 있습니다. 그리고 댓글을 남긴 회원이 나중에 회원 탈퇴해서 USER의 레코드를 삭제하려고 한다면 참조 무결성 제약조건에 의해 삭제할 수 없습니다. 이 경우에는 외래 키를 설정할 때, 삭제시 자동으로 처리할 동작을 옵션 값으로 지정할 수 있습니다.

ALTER TABLE <테이블명>
    ADD CONSTRAINT <제약 조건명>
    FOREIGN KEY <자식 컬럼> REFERENCES <부모테이블명(부모속성)>
    ON DELETE [RESTRICT | CASCADE | NO ACTION | SET NULL];

ALTER TABLE COMMENT
    ADD CONSTRAINT fk_comment_user
    FOREIGN KEY (user_id) REFERENCES USER(id)
    ON DELETE CASCADE;
옵션 내용
RESTRICT 개체를 변경/삭제할 때 다른 개체가 해당 개체를 참조하고 있을 경우, 변경/삭제가 취소
CASCADE 개체를 변경/삭제할 때 다른 개체가 해당 개체를 참조하고 있을 경우, 연쇄적으로 함께 변경/삭제
NO ACTION MySQL에서는 RESTRICT과 동일
Oracle에서는 기본 설정
SET NULL 개체를 변경/삭제할 때 다른 개체가 해당 개체를 참조하고 있을 경우 참조하고 있는 값은 NULL로 설정
PK는 SET NULL이 불가능

Oracle에서 NO ACTIONRESTRICT와 다르게 SQL 문장의 끝에서 확인되거나 제약 조건이 연기된 경우, 트랜잭션의 끝에서 확인합니다.

정리

무결성 제약조건은 데이터베이스가 데이터를 일관되게 저장하기 위해 존재하는 규칙입니다.


Profile picture

이재원

이해하기 쉬운 코드를 작성하려 고민합니다.


© 2024 Won's blog Built with Gatsby