무결성 제약조건
데이터의 무결성을 유지하려면 어떻게 해야할까? 데이터베이스에 정확한 정보만을 기입하면 될 것이다.
그러나, 아무리 꼼꼼하게 데이터를 저장한다 해도, 한번의 실수가 데이터베이스의 무결성을 해치게 될 것이다. 이를 위해 무결성 제약조건을 미리 정의하여 부정확한 정보가 입력되는 것을 미연에 방지하자.
무결성 제약조건은 데이터베이스 스키마에 명세되어, 데이터베이스 인스턴스에 저장될 수 있는 데이터를 제한한다. 이때, 명세와 실제로 무결성 제약 조건이 집행되는 시기는 다르기 때문에, 유의해야한다.
- 명세 : 데이터베이스 관리자가 데이터베이스 스키마를 정의할 때 무결성 제약조건을 정의한다.
- 집행 : 데이터베이스 응용이 실행될 때 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 사이여야 함 (도메인 무결성 위반)