무결성 제약 조건 (Intergrity Constraint)
관계형 데이터 베이스에서 데이터 무결성을 지키기 위한 제한된 조건을 의미한다.
입력, 삭제, 갱신하는 경우 항상 무결성 제약 조건을 만족할 때만 실행하도록 허용한다.
종류 | 설명 |
도메인 제약조건 | 속성의 자료 값은 항상 도메인의 원자값을 가져야한다. |
개체 무결성 제약조건 | 속성은 null이 아니고 중복이 불가능하다. |
키 제약조건 | 키 값은 유일하게 튜플을 식별해야한다. |
참조 무결성 제약조건 | 외부키 값은 반드시 기본키의 도메인 값이어야 한다. |
의미 무결성 제약 조건 | 조건을 명시한 제약조건은 지켜야한다. |
MySQL 에서 제공하는 제약조건
기본 키 제약 조건 PRIMARY KEY
기본 키 제약 조건에 해당하는 경우 해당 속성의 값은 중복을 허용하지않고 NULL을 허용하지 않는다.
기본 키로 생성하는 것은 자동으로 클러스터형 인덱스를 생성하게 된다. 기본 키는 둘 이상의 컬럼으로 지칭할 수 있다.
- 예시
CREATE TABLE userTbl(
userId BITINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
userName VARCHAR(24) NOT NULL,
lastVisit DATETIME NULL
);
CREATE TABLE 정의에서 PRIMARY KEY를 컬럼 정의 수식에 추가한다. userId는 이제 중복을 허용하지 않으며 NULL값을 가질 수 없다.
키 명칭을 명명하여 생성하는 방식
CREATE TABLE userTbl(
userId BITINT NOT NULL AUTO_INCREMENT,
userName VARCHAR(24) NOT NULL,
lastVisit DATETIME NULL,
CONSTRAINT PRIMARY KEY pk_usertbl_userid (userId)
);
CONSTRAINT PRIMARY KEY {alias} (column) 으로 테이블에 주 키 제약조건을 추가한다.
ALTER TABLE을 이용하여 정의 후에 추가하는 방식
ALTER TABLE userTbl ADD CONTRAINT pk_usertbl_userid PRIMARY KEY (userId);
외래키 제약조건 FOREIGN KEY
외래키 제약조건은 참조하는 테이블의 키와 종속 테이블의 키가 항상 같고 존재해야하는 제약 조건이다.
예시
CREATE TABLE accountTbl
(
accountId BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
userId BIGINT NOT NULL,
cashAmount BIGINT NOT NULL,
lastUpdate DATETIME NULL,
FOREIGN KEY(userId) REFERENCES userTbl(userId)
);
accountTbl 테이블의 경우 userTbl의 userId를 참조하는 userId 컬럼이 존재한다. 이를 외래키 제약조건으로 설정하는 경우 FOREIGN KEY(column) REFERENCES {parent_table}(parent_table_column)으로 만들어준다.
마찬가지로 명명을 사용하는 CONSTRAINT 추가 방식 혹은 ALTER TABLE도 가능하다.
CREATE TABLE accountTbl
(
accountId BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
userId BIGINT NOT NULL,
cashAmount BIGINT NOT NULL,
lastUpdate DATETIME NULL,
CONSTRAINT fk_usertbl_accounttbl FOREIGN KEY(userId) REFERENCES userTbl(userId)
);
ALTER TABLE accountTbl
ADD CONSTRAINT fk_usertbl_accounttbl FOREIGN KEY (userId)
REFERENCES userTbl(userId);
제약 조건에 따른 연쇄 행동
- ON DELETE CASCADE : 기준 테이블의 데이터 삭제시 참조 테이블의 데이터도 삭제한다.
- ON UPDATE CASCADE: 기준 테이블의 데이터 변경시 참조 테이블의 데이터도 변경한다.
ALTER TABLE accountTbl
ADD CONSTRAINT fk_usertbl_accounttbl FOREIGN KEY (userId)
REFERENCES userTbl(userId)
ON UPDATE CASCADE;
UNIQUE 제약조건
해당 컬럼은 중복 값을 허용하지 않는다. PRIMARY KEY에 필요 조건이 된다. PRIMARY KEY와 다르게 NULL을 허용하는 특징이 있다.
- emailAddress 컬럼은 UNIQUE 제약조건을 만족해야한다.
CREATE TABLE userTbl(
userId BITINT NOT NULL AUTO_INCREMENT,
userName VARCHAR(24) NOT NULL,
lastVisit DATETIME NULL,
emailAddress VARCHAR(30) NOT NULL UNIQUE,
CONSTRAINT PRIMARY KEY pk_usertbl_userid (userId)
);
CHECK 제약조건
해당 컬럼의 값이 특정 조건을 만족해야한다. 다른 제약조건과 달리 값에 대한 명시적 조건을 의미한다.
CREATE TABLE userTbl(
userId BITINT NOT NULL AUTO_INCREMENT,
userName VARCHAR(24) NOT NULL,
lastVisit DATETIME NULL CHECK (YEAR(lastVisit) >= 2000),
emailAddress VARCHAR(30) NOT NULL UNIQUE,
CONSTRAINT PRIMARY KEY pk_usertbl_userid (userId)
);
DEFAULT 제약조건
레코드 삽입시 값을 입력하지 않았을 때 기본 값으로 지칭하는 방법이다.
region 컬럼은 DEFAULT로 'Kor' 값을 가진다.
CREATE TABLE userTbl(
userId BITINT NOT NULL AUTO_INCREMENT,
userName VARCHAR(24) NOT NULL,
lastVisit DATETIME NULL CHECK (YEAR(lastVisit) >= 2000),
emailAddress VARCHAR(30) NOT NULL UNIQUE,
region VARCHAR(30) NOT NULL DEFAULT 'Kor',
CONSTRAINT PRIMARY KEY pk_usertbl_userid (userId)
);
NULL/NOT NULL 제약조건
해당 컬럼의 값이 NULL을 허용할지 말지를 결정한다.
'DB > 이론' 카테고리의 다른 글
RDBMS vs NoSQL (0) | 2022.05.02 |
---|---|
트랜잭션 고립 수준에 따른 부정합 문제 (0) | 2022.05.01 |
내부 조인과 외부 조인 (0) | 2022.04.30 |
테이블 정규화 (0) | 2022.04.29 |
클러스터형 인덱스 / 보조 인덱스 (0) | 2021.11.29 |