무결성 제약조건이란?

테이블 생성 시에 Constraint(제약조건)를 사용해서 입력하는 자료에 대해서 제약, 즉 규칙을 정해줄 수 있습니다. 이때 정해진 제약에 따라서 데이터가 입력이 됩니다. 만약 제약에 배반된다면 자료 입력이 거부되면서 오류가 납니다.

네이버 지식백과에서는 데이터 무결성에 대해서 다음과 같이 서술하고 있습니다.

무결성 : 데이터 및 네트워크 보안에 있어서 정보가 인가된 사람에 의해서만 접근이나 변경이 가능한 성질
데이터 무결성 : 데이터를 인가하지 않은 방법으로 변경할 수 없도록 보호하는 성질


쉽게 말해서, 권한이 부여된 계정이나 사람만이 접근 가능하고, 정확하고 완전한 데이터들이 저장되어 있는 상태라고 생각하면 됩니다. 여기서 제약조건은 이러한 데이터 무결성을 보장함으로써 이상한 데이터가 저장되지 않도록 하는 기능을 제공합니다.

제약조건

데이터의 무결성을 위해서 데이터베이스에서는 5가지 제약조건(Constraint)를 제공하고 있습니다.

제약조건내용
NOT NULL '필수 입력 사항'을 의미
 UNIQUE 중복성 배제 즉, '유일한 값'으로 존재해야 함을 의미
 PRIMARY KEY(기본키) NOT NULL + UNIQUE로, '테이블에서 대표되는 컬럼'을 의미
 FOREIGN KEY(외래키) '참조하는 테이블에서 존재하는 값만 사용 가능'을 의미
 CHECK '주어진 조건에 해당하는 값만 입력 가능'을 의미

1. NOT NULL

NOT NULL은 INSERT 시, 즉 데이터 입력시에 누락이 되어서는 안되는 부분입니다. NULL값이 들어가게 되면 오류가 납니다.

2. UNIQUE

UNIQUE는 해당 테이블에 있어서 존재하는 값이 유일해야 합니다. 만일 INSERT 또는 UPDATE 시, 제약이 걸려있는 컬럼에 동일한 데이터가 존재한다면 오류가 납니다. 이때, NULL 값에 대해서는 UNIQUE 제약이 적용되지 않습니다.  즉, NULL 값은 데이터로 인식하지 않기때문에 해당 컬럼에 NULL 데이터행이 여러개 존재 가능합니다.

테이블을 만들때 제일 밑에 CONSTRAINTS 제약명 UNIQUE (컬럼2, 컬럼3) 과 같이 CONSTRAINTS의 이름을 지정이 가능합니다. UNIQUE 제약으로 들어가는 컬럼들은 그들의 조합이 유일해야 합니다. 각 컬럼의 데이터의 유일함은 의미가 없고, 조합이 유일해야 합니다. 예를 들면, a라는 컬럼과 b라는 컬럼에 각각 1,2 그리고 1,3 (a 컬럼의 1 값이 동일)의 데이터는 존재가 가능합니다. a 컬럼의 데이터가 같다고 하더라도 그 조합이 다르기 때문에 오류를 일으키지 않습니다.

3. PRIMARY KEY

PRIMARY KEY는 하나의 테이블에 있는 데이터들을 식별하기 위한 기준으로 인식되는 제약조건입니다. 한개의 테이블에 하나만 생성이 가능합니다. PRIMARY KEY는 NOT NULL + UNIQUE 의 속성을 가집니다. 즉, NULL값이 있으면 안되고 해당 컬럼의 데이터는 중복되지 않고 유일해야 합니다. UNIQUE에서와 같이 여러 컬럼들을 조합해서 지정할 수 있습니다.

4. FOREIGN KEY

FOREIGN KEY는 해당 컬럼에 참조하는 테이블로부터 존재하는 값들만 사용한다는 의미의 제약조건입니다. 만일 참조하는 테이블에 해당하는 값이 없을시에는 INSERT시나 UPDATE시에 오류가 나게 됩니다. 외래키는 여러개의 컬럼에 중복적으로 적용 가능합니다. 외래키로 두 테이블이 부모테이블과 자식테이블로 관계를 맺고 있을시에, 자식테이블이 참조하는 데이터는 부모 테이블에서 삭제가 불가능합니다. (FOREIGN KEY의 기본옵션일 때) FOREIGN KEY는 4가지 옵션을 가지고 있는데 이 옵션에 따라 부모테이블에서 삭제할 시, 자식 테이블에서 참조하는 데이터도 삭제가 되도록 만들 수도 있습니다.

# FOREIGN KEY 옵션

NO ACTION

데이터베이스 엔진에서는 오류가 발생하며 부모 테이블의 행에 대한 삭제 또는 업데이트 동작이 롤백됩니다.

CASCADE

부모 테이블에서 해당 행이 업데이트되거나 삭제될 때 참조 테이블에서도 해당 행이 업데이트 또는 삭제됩니다. timestamp 열이 외래 키 또는 참조되는 키의 일부인 경우에는 CASCADE를 지정할 수 없습니다. INSTEAD OF DELETE 트리거가 있는 테이블에는 ON DELETE CASCADE를 지정할 수 없습니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 ON UPDATE CASCADE를 지정할 수 없습니다.

SET NULL

부모 테이블에서 행을 업데이트하거나 삭제하면 해당 외래 키를 구성하는 모든 값이 NULL로 설정됩니다. 이 제약 조건을 실행하려면 외래 키 열이 Null을 허용해야 합니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다.

SET DEFAULT

부모 테이블에서 해당 행을 업데이트하거나 삭제하면 외래 키를 구성하는 모든 값이 기본값(Default로 지정한 값)으로 설정됩니다. 이 제약 조건을 실행하려면 모든 외래 키 열에 기본 정의가 있어야 합니다. 열이 Null을 허용하고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다.

RESTRICT

자식테이블에 데이터가 남아있는 경우 부모 테이블의 데이터는 수정 또는 삭제를 할 수 없습니다.


CASCADE, SET NULL, SET DEFAULT 및 NO ACTION은 서로 참조 관계를 가진 테이블에서 결합될 수 있습니다. 데이터베이스 엔진 이 NO ACTION을 발견하면 관련된 CASCADE, SET NULL 및 SET DEFAULT 동작을 멈추고 롤백합니다. DELETE 문으로 CASCADE, SET NULL, SET DEFAULT 및 NO ACTION 동작을 결합하면 데이터베이스 엔진 이 NO ACTION을 확인하기 전에 모든 CASCADE, SET NULL 및 SET DEFAULT 동작을 적용합니다.


외래키를 사용한 테이블을 삭제할 때는 제약조건에 어긋나지 않게 순서대로 삭제해야 삭제가 됩니다.
참조하는 레코드 및 테이블 (자식 레코드 및 테이블)-> 참조당하는 레코드 및 테이블 (부모 레코드 및 테이블)

5. CHECK

CHECK는 조건에 부합하는 데이터만 입력이 가능하도록 하는 제약조건입니다. 조건에는 기본연산자나 비교연산자, IN, NOT IN 등등이 사용 가능합니다.

'DB' 카테고리의 다른 글

[SQL] WHERE절에서 IF문처럼 AND 사용  (0) 2017.02.02
[DB] 클러스터  (0) 2016.11.18
[DB] 무결성 제약조건  (0) 2016.11.18
[DB] 트랜잭션, REDO와 UNDO 개념  (0) 2016.11.18
[DB] DDL, DML, DCL 이란?  (0) 2016.11.18
[SQL] SELECT 결과 UPDATE  (0) 2016.11.18

+ Recent posts