/*
<제약 조건>
◎ 제약조건(Constraint)은 테이블이 가지는 열의 구조상 삽입될 수 있는 레코드를 특정 조건하에 제한하여
무결성을 보장하기 위해 사용한다.
[제약조건의 구조]
◎ 제약조건은 아래의 구조로 정의할 수 있다.
CONSTRAINT [`제약 조건 이름`]? [제약 조건 종류] ([`대상 열`,...])
[기본 키(주키,Primary Key,PK)]
◎ 제약 조건 키워드 : PRIMARY KEY
◎ 테이블이 가지는 주 축이될 열(들)이다.
◎ 하나의 테이블은 한 개 이상의 열을 하나로 묶어 기본 키로 설정할 수 있으나, 하나의 테이블이 여러개의 기본 키를
가져서는 안된다.
◎ 레코드를 식별할 수 있는 값을 의미하는 열이 있다면 그 열을, 없다면 주로 순번(엄밀히 얘기하면 순번은 X)
을 의미하는 index 열을 기본 키로 한다.
◎ 기본 키로 설정된 열(들) 하에 동일한 값을 가지는 레코드는 중복될 수 없다.
◎ 레코드 값 중복이 불가능한 것은 유니트(UNIQUE) 제약 조건의 내용과 전적으로 동일하다. 유니크와 기본키의 차이는
클러스터드 인덱싱 여부인데, 기본 키에 대해서는 인덱싱(Clustered Index)이 이루어지며, 유니크에 대해서는 인덱싱
(Non-clustered Index)하지 않는다.
- 인덱스(index) : 인덱스를 생성하는 것을 인덱싱(Indexing) 이라 하며, 기본 키로 지정된 열의 접근점을
메모리에 목차화하여 선택(Select) 이나 정렬(Order) 등의 성능을 향상시킨다.
단, 이러한 이점 때문에 쓸모없는 열 까지 인덱싱 해버리면 메모리 오버헤드(Overhead)가 발생하여
성능상 패널티가 커짐으올 크게 생각하지 않고 어떠한 테이블의 주요한(레코드를 특정 지을수 있는)
열만 기본키로 지정하여 인덱싱을 제한하는 것이 좋다.
[유니크(Unique,UQ)]
◎ 제약 조건 키워드 : UNIQUE
◎ 유니크로 설정된 열에 해당하는 레코드가 가지는 값이 중복되어서는 안된다.
◎ 중복 불가라는 점이 기본 키와 비슷하나 유니크 키는 하나의 테이블이 여러개를 가질 수 있다.
◎ 마찬가지로 인덱싱이 되기 때문에(Non-clustered Index) 불필요한 유니크는 성능 저하를 유발할 수 있다.
◎ 또한, 기본 키는 NULL 을 허용하지 않지만 유니크는 NULL 을 허용하며, NULL 값에 대해서는 중복 검사를 하지
않음으로 무결성에 문제가 생길 수 있다.
[체크(Check,CK)]
◎ 제약 조건 키워드 : CHECK
◎ 어떠한 값에 대해 조건을 만족할 때에만 삽입이 가능하게하는 제약 조건이다.
◎ 체크 제약 조건을 남발할 경우 성능 저하가 있을 수 있음으로 유의한다.
◎ 어떠한 값에 대한 검사(Validation)는 어플리케이션 레이어(Application Layer) 에서 필수적으로 선행되어야 한다.
[외래 키(Foreign Key,FK)]
◎ 제약 조건 키워드 : FOREIGN KEY ... REFERENCES ...
◎ 외래 키 제약 조건이 적용되는 열이 가지는 레코드 값은 참조 대상인(Referencing) (다른) 테이블의 열이 가지는 레코드 값
으로 제한하기 위해 사용하는 제약 조건이다.
◎ 참조 대상이 되는 열을 기본 키 이거나 유니크 여야한다.
◎ 참조 하고 있는 대상이 존재하는 경우 참조 대상(피참조자)이 삭제되거나 수정될 수 없음으로 피참조자가 삭제/수정 되는 경우
그 데이터(레코드)가 따라서 삭제/수정 될수 있게하기 위해 아래와 같이 외래 키 제약 조건을 구성하는 편이다.
...
FOREIGN KEY ... REFERENCES ...
ON DELETE CASCADE
ON UPDATE CASCADE
...
- ON DELETE CASCADE : 피참조자가 삭제(Delete)될 경우 참조자 역시 함께 삭제된다는 의미이다.
- ON UPDATE CASCADE : 피참조자가 수정(Update)될 경우 참조자 역시 함께 수정된다는 의미이다.
*/