데이터베이스의 무결성 제약 조건
무결성 제약 조건이란?
무결성은 쉽게 말해 데이터에 결함이 없는 상태를 말해요.
데이터베이스에 있는 데이터들에 어딘가 문제가 있으면 안 되겠죠?
따라서 무결성 제약조건을 두어 데이터베이스에 저장된 데이터의 무결성을 보장하고, 데이터베이스의 상태를 일관되게 유지합니다.
무결성 제약조건은 크게 아래의 그림처럼 나뉩니다.
도메인 제약조건(Domain Constraint)
도메인 제약조건은 쉽게 말해 가질 수 있는 값들에 대한 제약조건이라고 보시면 돼요.
- 각 애트리뷰트 값이 반드시 원자값이어야 함.
- 릴레이션 내의 튜플들이 각 속성의 도메인 값만을 가져야 함. 예) 학번에는 숫자만 올 수 있음
- CHECK 제약조건 : 애트리뷰트 값의 가능한 값의 범위 등을 지정할 수 있음
- DEFAULT : 애트리뷰트의 디폴트 값 설정 가능
- Not Null : 기본키의 경우 NOT NULL 제약 조건 들어감.
예)
CREATE TABLE Persons (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
개체 무결성 조건(entity integrity constraint)
- 릴레이션의 기본키를 구성하는 어떤 애트리뷰트도 널값을 가질 수 없다.
- 데이터 정의문에서 어떤 애트리뷰트가 릴레이션의 기본 키의 구성요소인가를 DBMS에게 알려주어야 함.
- 중복값을 가질 수 없다.
참조 무결성 제약 조건(referential integrity constraint)
참조 무결성 제약조건은 참조가 있는, 즉 외래키가 있는 상황에서 두 릴레이션의 연관된 튜플들 사이의 일관성을 유지하는데에 사용됩니다.
외래키 제약으로도 불러요.
이런 회원 릴레이션이 있을 때,
INSERT INTO MEMBER VALUES (5555, '홍길동', 6666)
이런 연산을 수행하게 되면 어떻게 될까요?
멘토 애트리뷰트는 학번이라는 기본키를 참조하는 외래키인데요.
기본키의 튜플에는 6666이라는 학번이 없습니다. 따라서 존재하지 않는 값을 참조하려 하므로 삽입 연산이 수행되지 않습니다.
이렇듯 외래키가 어떤 릴레이션의 기본키를 참조할 때 참조 무결성 제약조건은 아래의 두 조건 중 하나가 성립되면 만족됩니다.
- 외래 키의 값은 참조되는 기본 키의 어떤 튜플 값과 같다.
- 그렇지 않으면 널 값을 가진다.
2번의 경우에는 엔티티 무결성 제약조건에 의해 외래키가 본인 릴레이션의 기본키이면 안되겠죠??
무결성 제약조건을 왜 지켜야하는가?
이런 무결성 제약조건의 유지는 데이터베이스에 대한 갱신(삽입, 삭제, 수정) 연산이 발생할 때 중요합니다.
DBMS는 각각의 갱신 연산에 대해 데이터베이스가 무결성 제약조건들을 만족하도록 필요한 조치를 취합니다.
각각의 갱신 연산을 먼저 알아봅시다
삽입 연산
새로운 튜플을 삽입할 때는 여러 상황들이 발생할 수 있습니다.
일단, 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건을 지켜야 하고요.
만약 참조하는 릴레이션에 새로운 튜플을 삽입할 때는 참조 무결성 제약조건을 위배할 수도 있습니다. 위에서 살펴봤던 예시가 바로 그런 예시죠?? 이런 경우에는 DBMS가 삽입 연산을 거절함으로써 무결성을 유지합니다.
삭제 연산
튜플이 삭제될 때는 참조 무결성 제약조건만 유심히 봐주시면 됩니다.
참조당하는 릴레이션에서 튜플이 삭제되면 어떻게 될까요?
예를 들어
여기서 갑자기 (3333, '이순신', 4444) 튜플을 삭제한다고 생각해봅시다.
그러면 김유신씨의 멘토는 3333번인데 3333번이 존재하지 않기때문에 오류가 나겠죠??
(1111, '홍길동', )을 삭제할때는 아무일도 일어나지않고 정상적으로 삭제가 됩니다.
이렇듯 참조 무결성 제약조건을 위배하는 경우가 생길 수 있습니다.
수정 연산
수정 연산에서는 수정하는 애트리뷰트가 기본 키인지 외래 키인지 검사합니다.
기본 키, 외래 키 둘 다 아니면 수정 연산을 해도 상관이 없겠죠?
수정 연산은 기존 튜플을 삭제하고 새로운 튜플을 그 자리에 삽입하는 것과 유사하므로 삽입, 삭제에서 설명한 것들이 수정 연산에도 적용됩니다.
무결성 제약조건 유지를 위해 DBMS가 제공하는 옵션들
참조 무결성 제약조건..요놈이 참 문제인데요
얘를 만족하기 위해서 DBMS가 제공하는 옵션 네가지를 살펴봅시다.
제한(Restricted)
위배를 야기한 연산을 단순하게 거절합니다.
연쇄(cascade)
문제 되는 건 그냥 싸그리 지워버립니다.
예를 들어
이 테이블에서 (3333, '이순신', 4444)를 삭제하면 (2222, '김유신', 3333)에서 참조 무결성 제약조건이 위배되죠?
그래서 (2222, '김유신', 3333)도 같이 삭제해버리는 것이 바로 연쇄 옵션입니다.
SET NULL
삭제연산은 일단 수행하고, 문제되는 부분에 NULL값을 삽입합니다.
(2222, '김유신', NULL)으로 바꾸는 거죠
SET DEFAULT
널값을 넣는 대신에 디폴트값을 넣습니다.
위의 옵션들은
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
위의 조건을 넣음으로써 수행할 수 있습니다.
CREATE TABLE EMPLOYEE (
EMPNO int primary key,
EMPNAME varchar(100),
DNO int DEFAULT 1,
CONSTRAINT EMPLOYEE_DNO_FK REFERENCES DEPARTMENT (DNO)
ON DELETE SET DEFAULT
)
이런식으로요.