개요
무결성 제약조건이란, 일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적 또는 명시적으로 정의한 것이다.
DB가 갱신될 때, DBMS가 자동적으로 조건을 검사하므로 응용 프로그램들은 조건을 검사할 필요는 없다.
목록
도메인 제약조건
1. 각 애트리뷰트 값은 원자값이어야 한다.
2. 애트리뷰트 값의 디폴트 값, 가능한 값들의 범위 등을 지정할 수 있다.
3. 데이터 형식을 통해 값들의 유형을 제한하고, CHECK 제약 조건을 통해 값들의 범위를 제한할 수 있다.
위의 예시에서 ID 애트리뷰트는 int로 유형을 제한, 또한 NULL일 수 없다.
Age 애트리뷰트는 데이터 형식과 CHECK 제약 조건을 통해 18 이상의 정수로 범위를 제한했다.
CHK_Person처럼 여러 개의 애트리뷰트에 걸쳐 도메인 제약 조건을 지정할 수도 있다.
CHK_Person에 의해 Age 애트리뷰트가 18 이상이어야 하고, City는 Sadnes 이어야 한다.
키 제약조건
키 애트리뷰트에 중복된 값이 존재해서는 안된다. 또한 키 애트리뷰트는 NULL 값을 가질 수 없다.
ID 애트리뷰션에 제약 조건 NOT NULL로 NULL이 될 수 없음을, UNIQUE로 고유하다고 표시한 예시이다.
애트리뷰트 하나만 지정하는 것이 아니라 UC_Person처럼 두 개 이상의 애트리뷰트를 묶어서 고유하다고 표시할 수도 있다.
엔티티 무결성 제약조건
개체 무결성이라고도 한다.
기본 키는 각 튜플들을 식별하기 위해 사용된다. 따라서 릴레이션의 기본키를 구성하는 애트리뷰트는 NULL 값을 가질 수 없다. (대체 키에는 적용되지 않는다.)
참조 무결성 제약조건
두 릴레이션의 연관된 튜플 사이의 일관성을 유지하기 위해 사용된다.
외래 키의 값은 참조할 수 없는 값을 가질 수 없기 때문에, NULL이거나 참조하는 릴레이션의 기본 키 값과 동일해야 한다.
릴레이션 R2의 외래 키가 릴레이션 R1의 기본 키를 참조한다고 할 때, 아래 두 조건 중 하나가 성립된다면 참조 무결성 제약조건은 만족한다.
1. 외래 키의 값이 R1의 어떤 튜플의 기본 키 값과 같을 때
2. 외래 키가 자신을 포함하는 릴레이션의 기본 키가 아닐 때, NULL 값을 가지는 경우
DEPARTMENT 릴레이션(R1)의 기본 키인 DEPTNO를 EMPLOYEE 릴레이션(R2)에서 DNO라는 외래 키로 참조한다.
DNO에서 가질 수 있는 값은 다음과 같다.
1. DNO는 R1의 기본 키 값과 같아야 한다. 즉, 여기서는 1, 2, 3, 4 중 한 값을 가질 수 있다.
2. DNO가 R2의 기본 키가 아니기 때문에, (R2의 기본 키는 EMPNO) NULL 값도 가질 수 있다.
따라서 DNO가 1, 2, 3, 4, NULL 중 한 값을 가지면 참조 무결성 제약조건을 만족한다.
무결성 제약조건 유지
데이터베이스에 대한 갱신은 삽입, 삭제, 수정으로 구분할 수 있다.
DBMS는 각각의 갱신 연산에 대해 무결성 제약조건을 만족하도록 필요한 조치를 취한다.
삽입 연산
참조되는 릴레이션에 새로운 튜플이 삽입될 때에는 참조 무결성 제약조건은 위배되지 않는다. (그림 1의 R1에 새로운 튜플을 넣을 때)
참조하는 릴레이션에 새로운 튜플이 삽입될 때에는 참조 무결성 제약조건이 위배될 수 있다. (그림 1의 R2에 (1234, 김철수, 6)이라는 튜플을 삽입하면 DNO가 R1의 기본 키가 아닌 값을 가지기 때문에 참조 무결성 제약 조건에 위배된다.)
기본 키 애트리뷰트 값에 따라 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건 등을 위배할 수 있다.
제약조건을 위배하는 삽입 연산은 DBMS가 거절함으로써 무결성을 유지한다.
삭제 연산
참조하는 릴레이션에서 튜플이 삭제되는 경우에는 도메인, 키, 엔티티 무결성, 참조 무결성 제약조건 모두 위배하지 않는다.
참조되는 릴레이션에서 튜플이 삭제되는 경우에는 참조 무결성 제약조건을 위배할 수 있다.
그림 1을 다시 보자. DEPARTMENT 릴레이션에서 (4, 홍보, 8) 튜플은 삭제해도 상관이 없다.
하지만 (3, 개발, 9) 튜플을 삭제한다면 EMPLOYEE 릴레이션에서 DNO이 3인 튜플들이 있기 때문에 참조 무결성 제약조건을 위배한다.
참조 무결성 제약조건을 만족하기 위해서 DBMS는 다음과 같은 옵션을 제공한다.
제한 (Restricted)
위배를 야기한 연산을 단순히 거절한다.
ex) 그림 1에서 DEPARTMENT의 (3, 개발, 9) 튜플을 삭제하는 것은 무결성 제약조건에 위배되므로 삭제 연산 거절하기
연쇄 (Cascade)
참조되는 릴레이션에서 튜플을 삭제하고, 참조하는 릴레이션에서 이 튜플을 참조하는 모든 튜플을 함께 삭제한다.
ex) 그림 1에서 DEPARTMENT의 (3, 개발, 9) 튜플을 삭제하고, EMPLOYEE의 (3426, 박영권, 3) 튜플과 (3427, 최종철, 3) 튜플을 모두 삭제
NULL 값
참조되는 릴레이션에서 튜플을 삭제하고, 참조하는 릴레이션에서 이 튜플을 참조하는 모든 튜플에 NULL 값을 삽입
ex) 그림 1에서 DEPARTMENT의 (3, 개발, 9) 튜플을 삭제하고, EMPLOYEE의 (3426, 박영권, 3) 튜플과 (3427, 최종철, 3) 튜플을 (3426, 박영권, NULL), (3427, 최종철, NULL)로 변경
디폴트 값
NULL 값 대신 디폴트 값 넣어주기
ex) DEPTNO의 디폴트 값이 1이라면, 그림 1에서 DEPARTMENT의 (3, 개발, 9) 튜플을 삭제하고, EMPLOYEE의 (3426, 박영권, 3) 튜플과 (3427, 최종철, 3) 튜플을 (3426, 박영권, 1), (3427, 최종철, 1)로 변경
외래 키에 제약조건을 걸어준 예시이다.
EMPLOYEE_DNO_FK 제약 조건에 의해 삭제될 때 디폴트 값을 넣어준다.
NO ACTION(제한), CASCADE(연쇄), SET NULL(NULL 값), SET DEFAULT(디폴트 값)으로 구분해주는 모습.
수정 연산
수정은 기본적으로 해당 튜플을 삭제 후 수정된 튜플을 삽입해주는 것과 같다.
삽입 연산과 삭제 연산에 대해 각각 무결성 제약 조건을 만족해 주면 된다.
'CS > DB' 카테고리의 다른 글
[SQL] Table 생성 및 수정, 삭제 (0) | 2022.04.25 |
---|---|
[SQL] 내포된 SQL (0) | 2022.04.24 |
[DB] 연산자 (0) | 2022.03.23 |
[DB] 릴레이션 키 (1) | 2022.03.17 |
[DB] 트랜잭션 (0) | 2022.03.15 |