데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 의미합니다. 여기서 정확성이란 중복이나 누락이 없는 상태를 뜻하고, 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태를 뜻합니다.
만약 데이터베이스에서 데이터 무결성 설계를 하지 않는다면 테이블에 중복된 데이터 존재, 부모와 자식 데이터 간의 논리적 관계 깨짐, 잦은 에러와 재개발 비용 발생 등과 같은 문제가 발생할 것입니다.
그렇기 때문에 DBMS에서 데이터의 무결성이 유지되는 것은 중요한 사항이며, 주로 데이터에 적용되는 연산에 제한을 두어 데이터의 무결성을 유지합니다.
기본 키 제약이라고도 하며, 테이블은 기본키를 지정하고 그에 따른 무결성 원칙을 지켜야 하는 조건
기본 키(Primary Key)에는 Null 값이 올 수 없음
기본 키는 테이블 내에 오직 하나의 값만 존재해야 함
(하나의 테이블 내에 동일한 기본 키를 가진 레코드는 존재할 수 없음)
*기본 키란?
테이블에서 특정 레코드를 구별하기 위해 후보 키 중에서 선택된 고유한 식별자 키
CREATE TABLE Student ( StudentID INT PRIMARY KEY, -- NULL 불가 + 유일 Name VARCHAR(50) );
외래 키 제약이라고도 하며, 테이블 간의 참조 관계를 선언하는 제약조건
외래 키(Foreign Key)의 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 함
외래 키 속성은 참조할 수 없는 값을 지닐 수 없음
(즉, 외래 키 속성 값이 상위 테이블의 인스턴스에 반드시 존재하거나 Null이어야 함)
CREATE TABLE Student ( StudentID INT PRIMARY KEY, Name VARCHAR(50) ); CREATE TABLE Enrollment ( EnrollmentID INT PRIMARY KEY, StudentID INT, FOREIGN KEY (StudentID) REFERENCES Student(StudentID) -- 참조 무결성 );
테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 필드의 타입, Null 값 허용 등에 대한 사항을 정의하고 올바른 데이터가 입력되었는지 확인하는 조건
예를 들어 주민등록번호 필드에 문자가 입력되는 경우엔 도메인의 무결성이 깨졌다고 볼 수 있음
CREATE TABLE Product ( ProductID INT PRIMARY KEY, Price DECIMAL(10, 2) CHECK (Price >= 0) -- 음수 불가 );
테이블의 특정 속성 값이 Null이 될 수 없게 하는 조건
CREATE TABLE Member ( MemberID INT PRIMARY KEY, Email VARCHAR(100) NOT NULL -- 반드시 입력 );
테이블의 특정 속성에 대해 각 레코드들이 갖는 값들이 서로 달라야 하는 조건
CREATE TABLE UserAccount ( UserID INT PRIMARY KEY, Username VARCHAR(50) UNIQUE -- 중복 불가 );
하나의 테이블에는 적어도 하나의 키가 존재해야 하는 조건
CREATE TABLE Customer ( CustomerID INT PRIMARY KEY, -- NULL 불가 + 유일 Name VARCHAR(50) );
테이블의 어느 한 레코드의 삽입 가능 여부 또는 한 테이블과 다른 테이블의 레코드들 사이의 관계에 대한 적절성 여부를 지정한 조건
CREATE TABLE Orders ( OrderID INT PRIMARY KEY, CustomerID INT, FOREIGN KEY (CustomerID) REFERENCES Customer(CustomerID) -- 고객이 존재해야 주문 가능 );
스키마를 정의할 때 일관성 조건을 오직 한 번만 명시하고, 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없음
프로그래밍 작업이 훨씬 복잡해지고, 무결성 제약조건을 반복해서 구현해야 하고, 무결성 제약조건들 간에 서로 충돌이 발생할 수 있음
개념 설명은 잘 되어 있는데 실제 SQL 예시가 전혀 없음.
각 무결성 제약조건을 실제 테이블 생성할 때 어떻게 적용하는지 보여줘야 이해됨.
이런 식으로 직접 써봐야 각 제약조건이 어떻게 동작하는지 명확해짐.