무결성이란?
무결성은 데이터베이스에 저장된 정보가 현실 세계의 실제 값과 정확하게 일치함을 보장하는 중요한 개념입니다.
무결성 제약조건
무결성 제약조건은 데이터베이스 내에 저장되는 정보가 정확하고 신뢰할 수 있도록 하기 위해 설정되는 규칙이라고 볼 수 있습니다.
분류 | 설명 |
---|---|
개체 무결성 | 기본 키는 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
뒤에 제약 조건명을 지정할 수 있습니다.
변경시 확인하는 무결성
DEPARTMENT
의 주키를 EMPLOYEE
테이블에서 외래키 dept_id
로 참조해 다대일 관계를 맺고 있습니다.
INSERT하는 경우
릴레이션에 새로 삽입되는 데이터는 도메인, 키, 엔티티 무결성 제약조건을 위배할 수 있습니다.
개체 무결성을 지키기 위해 기본키가 NULL이거나 중복인지 확인해야 합니다.
참조되는 테이블인 DEPARTMENT
은 레코드 삽입시 참조 무결성 제약조건은 위배되지 않습니다. 하지만 위의 제약 조건을 확인해야 합니다.
DEPARTMENT
테이블을 외래키로 참조하는 릴레이션인 EMPLOYEE
의 경우에는 위의 제약조건 뿐만 아니라 참조 무결성 제약조건도 위배할 가능성이 있습니다. 그래서 이 조건들을 위배하는 삽입 연산은
DBMS가 거절하여 무결성을 유지합니다.
UPDATE하는 경우
만약 기본 키나 외래 키를 수정하려 하면 참조 무결성에 위배되는지 확인합니다.
또는, 기본 키나 외래 키 이외의 애트리뷰트 값을 수정하고자 하면 참조 무결성 제약조건을 위배하지 않아서 나머지 제약조건을 만족하는지만 검사합니다.
ON UPDATE
Oracle은 ON UPDATE
옵션 설정이 불가능합니다. 따라서 Trigger를 사용해야 합니다.
DELETE하는 경우
삭제하는 경우, 참조하는 테이블인 자식 테이블을 따로 검사하지 않아도 됩니다. 하지만 참조당하는 테이블인 부모 테이블의 레코드를 삭제하려고 하는 경우, 해당 레코드의 기본 키가 다른 테이블에서 참조하고 있는지 확인해야 합니다.
즉, 참조 무결성을 위배하는지 확인 후에 삭제할 수 있습니다.
ON DELETE
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 ACTION
은 RESTRICT
와 다르게 SQL 문장의 끝에서 확인되거나 제약 조건이 연기된 경우, 트랜잭션의 끝에서 확인합니다.
정리
무결성 제약조건은 데이터베이스가 데이터를 일관되게 저장하기 위해 존재하는 규칙입니다.