본문 바로가기

6. 컴퓨터 공학 공부

[114] 데이터베이스 08차시 관계 데이터베이스 제약조건

1. 무결성 제약조건

가. 관계 모델의 무결성 제약조건

1) 도메인 무결성 제약조건(Domain Integrity Constraints)

속성의 값은 해당 속성의 도메인의 원소이어야 함.

2) 키 무결성 제약조건(Key Integrity Constraints)

키 속성 값은 반드시 유일해야 함.

3)엔티티 무결성 제약조건(Entity Integrity Constraints)

키 속성 값은 반드시 null 이 되어서는 안됨.

4) 참조 무결성 제약조건(Referential Integrity Constraints)

외래키 제약조건이라고도 함.

참조하는 릴레이션의 외래키 속성 FK 값은 참조되는 릴레이션의 PK 값 집합에 속하는 값이거나 null이어야 함.

null값을 가진다는 것은 참조 관계가 없다는 의미

5) 비즈니스 룰/시멘틱 제약조건(Business Rule/Semantic Integrity Constraints)

각 조직 나름대로의 규칙이나 앞서 언급한 제약조건으로는 검사가 되지 않는 조건들이 해당

예) 사원이 프로젝트에서 1주일에 일하는 시간이 최대 56시간을 넘어서는 안 됨.

예)일반 사원의 봉급은 선임 사원의 봉급을 초과할 수 없음.

표준 SQL에서는 trigger 나 ASSERTION을 이용하여 비즈니스 룰 제약조건을 설정하도록 지원함.

2. 제약조건의 위반 처리

가. 갱신 연산과 제약조건 위반 처리

릴레이션에 대한 갱신 연산 시 무결성 제약조건을 DBMS가 검사

갱신 연산: 삽입(Insert), 삭제(Delete), 수정(Update)

갱신 연산을 실행하는 경우 스키마에 정의된 무결성 제약 조건을 위반하지 않아야 함.

제약조건 위반 시 다양한 조치가 취해질 수 있음.

1) 제약조건의 위반을 초래한 연산을 취소

RESTRICT 옵션 또는 REJECT 옵션

2) 위반 사항을 정정할 수 있도록 추가적인 갱신을 트리거

CASCADE, SET NULL, SET DEFAULT 옵션

3) 일단 연산을 수행하고 위반 사항을 사용자에게 알림

사용자 정의 오류정정프로시저를 수행

나. 삽입 연산 시 제약조건의 위반

4가지 제약조건을 위반할 수 있음.

1) 도메인 제약조건 위반

삽입되는 투플 t 에서 애트리뷰트의 값이 도메인에 없으면 도메인 제약 조건을 위반

2) 키 제약조건 위반

t에서 기본키 값이 다른 투플에 이미 존재한다면 키 제약 조건을 위반

3) 엔티티 제약조건 위반

t에서 기본키 값이 null 이면 엔티티 제약조건을 위반

4) 참조 제약조건 위반

t 에서의 외래키 값이 참조되는 릴레이션의 키 값 집합에 속하지 않는다면 참조 제약조건 위반

제약조건을 위반하면 삽입을 거부하거나 그 위반 사실을 사용자에게 알려야 함.

다. 삭제 연산 시 제약조건의 위반

단지 한 가지 제약조건을 위반할 수 있음.

참조 제약조건의 위반

투플이 삭제되는 경우 다른 테이블에서 참조하고 있는지 검사하여 그렇지 않는 경우에만 삭제함.

삭제 연산이 참조 무결성 제약 조건을 위반하는 경우 취할 수 있는 세가지 옵션

1) 삭제 거부

2) 삭제되는 투플을 참조하는 투플들까지 모두 삭제(연쇄 삭제, cascade)

3) 삭제되는 투플을 참조하는 투플에서 외래키 값을 널로 바꾸거나(set null) 다른 유효한 투플을 참조하도록 변경(set default)

위의 세 가지 옵션 중 사용자가 응용의 특성에 적합한 것을 선택하도록 하는 것이 바람직함.

라. 갱신 연산 시 제약조건의 위반

갱신 연산은 기본적으로 "삭제 후 삽입" 연산으로 간주할 수 있으므로 삽입과 삭제 시의 문제점이 모두 나타남.

기본키나 외래키가 아닌 속성의 값 변경은 문제가 발생하지 않음.

마. 제약조건의 위반 예제

사원

사번 사원명 입사일자 주소 봉급 부서번호
1 2010 서울 340 100
2 2013 광주 300 100
3 2018 부산 200 null

부서

부서번호 부서명 예산
100 총무 300
200 자재 6000

1) 삭제 시 제약조건 위배

① 사원 테이블에서 사번이 1인 사원을 제거하라는 연산은 제약조건을 위배하는가?

답) 어떠한 제약조건도 위배하지 않음.

② 사원 테이블에서 1번 사원이 제거된 상태에서, 다시 2번 사원을 제거하라는 연산은 제약조건을 위배하는가?

답) 어떠한 제약조건도 위배하지 않음.

③ 부서 테이블에서 부서번호가 100번인 부서를 제거 하라는 연산은 제약조건을 위배하는가?

답) 참조 제약조건을 위배함. 위반 처리 옵션에 따라 다른 조치가 취해짐. 일반적으로는 주어진 제거 연산을 거부함.

2) 삽입 시 제약조건 위배

① 사원 테이블에 이름이 병인 새로운 사람을 사번을 3으로 하여 삽입하라는 연산은 제약조건을 위배하는가?

답) 키 제약조건을 위배함. 사번이 키 속성이고, 사번이 3인 사원이 이미 존재하고 있기 때문.

② 부서 테이블에 아직 부서번호가 배정되지 않고 부서명이 인사과인 투플을 삽입하라는 연산은 제약조건을 위배하는가?

답) 엔티티 제약조건을 위배함. 부서번호가 키 속성인데, 인사과의 부서번호가 정해지지 않았으므로 null 로 삽입되기 때문임.

③ 사원 테이블에 투플 <4, 병, 2019, 대구, 200, 500>을 삽입하라는 연산은 제약조건을 위배하는가?

답) 참조 제약조건을 위배함. 외래키 값으로 지정된 부서번호 500은 부서 테이블의 PK인 부서번호에 나타나는 값에 속하지 않기 때문.

의미를 따져보면 500번 부서는 없는데, 병이라는 사원이 부서번호 500 이라는 부서에 근무하는 것으로 되어 제약조건을 위배하게 됨.

참고로 키가 아닌 속성들의 값은 중복되어도 됨.

이 예에서는 3번 사원이 이름이 병인데 새로운 사원의 이름도 병임.

④ 사원 테이블에 투플 <5, 경, 2019, 서울, 200, null>을 삽입하라는 연산은 제약조건을 위배하는가?

• 답) 어떠한 제약조건도 위배하지 않음. 외래키 값으로 null이 가능함.