CS/데이터베이스(Database)

무결성 제약조건

배씌 2025. 3. 31. 15:39

데이터의 무결성을 유지하려면 어떻게 해야할까? 데이터베이스에 정확한 정보만을 기입하면 될 것이다.

 

그러나, 아무리 꼼꼼하게 데이터를 저장한다 해도, 한번의 실수가 데이터베이스의 무결성을 해치게 될 것이다. 이를 위해 무결성 제약조건을 미리 정의하여 부정확한 정보가 입력되는 것을 미연에 방지하자.

 

무결성 제약조건은 데이터베이스 스키마에 명세되어, 데이터베이스 인스턴스에 저장될 수 있는 데이터를 제한한다. 이때, 명세와 실제로 무결성 제약 조건이 집행되는 시기는 다르기 때문에, 유의해야한다.

 

- 명세 : 데이터베이스 관리자가 데이터베이스 스키마를 정의할 때 무결성 제약조건을 정의한다.

- 집행 : 데이터베이스 응용이 실행될 때 DBMS가 명세되어 있는 무결성 제약조건을 위반하는 사항에 대해 검사한 후 데이터 변경을 결정한다.


개체 무결성

테이블의 각 튜플(행)을 유일하게 식별하기 위한 무결성 조건이다. 이를 위해 기본키(Primary key)를 활용하여 각 튜플을 고유하게 식별한다.

 

- 특징

  • 기본키는 NULL 값이 들어올 수 없다.
  • 동일한 값이 들어올 수 없다.

- 예시

학생(학번, 이름, 학과) 릴레이션
학번 (Primary key) 이름 학과 설명
250301 김XX 컴퓨터공학과  
250302 김XX 전자공학과  
250302 박XX 기계공학과 X (학번 중복)
NULL 최XX 영문학과 X (NULL 값 허용 X)

참조 무결성

외래키(foreign key) 를 통해 테이블 간의 관계를 유지한다. 외래키의 값은 반드시 참조되는 테이블의 기본키(Primary key)여야 함.

 

- 예시 (상품, 카테고리 릴레이션)

상품 (상품번호, 시리얼넘버, 상품 명, 가격, 카테고리 번호)
카테고리 (카테고리 번호, 카테고리 명)

 

[카테고리 테이블]

카테고리 번호 카테고리 명
1 Novel
3 History

 

[상품 테이블]

상품 번호 시리얼 넘버 상품 명 가격 카테고리 번호
20101927 null The Second World War 37800 3
97422537 null Hobbit 28800 1
97422515 null Lord of the Rings 1 28800 1
20121234 null IronMan 1 35400 2 -> X (없는 카테고리 번호)

 

그림으로 나타내면 아래와 같다.

 

만약, 부모 테이블의 기본키가 변경되면, 자식 테이블의 외래키도 변경해주어야 한다.

(Category : CategoryNo) <- (Product : CategoryNo)


도메인 무결성

특정 속성은 정의된 도메인(값의 범위) 내에서만 값을 가져야 한다. 속성의 데이터 타입, 크기, 허용 값 등을 제한함

학번 이름 학년
202301 김XX 3
202401 최XX 1
202501 이XX 5 -> X (1~4 사이의 값을 가져야 함.)

무결성 제약조건 집행

위에서 설명한 무결성 제약조건들을 실제 DBMS에서 구현하는 방법이다. 제약조건을 위반하면, 데이터 추가 삭제 등을 제한한다.

제약조건 SQL 설명
개체 무결성 PRIMARY KEY (키) 기본키는 NULL, 중복 허용 X
참조 무결성 FOREIGN KEY (키) REFERENCES (참조 테이블) (기본 키) 외래키는 참조하려는 테이블의 기본키를 참조한다.
도메인 무결성 CHECK (속성 (조건)) 해당 속성의 값의 범위를 설정

 

- 예시

-- FOREIGN KEY(학번) REFERENCES 학생 (학번)

INSERT INTO 수강과목 (학번, 과목명, 교수명)
VALUES (202304, '네트워크', '최교수');
-- ERROR: 존재하지 않는 학번(참조 무결성 위반)
-- PRIMARY KEY(학번)

UPDATE 학생
SET 학번 = NULL
WHERE 학번 = 202301;
-- ERROR: 기본 키는 NULL이 될 수 없음 (개체 무결성 위반)
-- CHECK (학년 BETWEEN 1 AND 4)

INSERT INTO 학생 (학번, 이름, 학년)
VALUES (202305, '강감찬', 5);
-- ERROR: 학년은 1~4 사이여야 함 (도메인 무결성 위반)