PRIMIRY KEY
1. 특징
- NULL 값을 가질 수 없음
- UNIQUE 제약조건
- 주의사항
- 로그성 테이블에도 기본적인 PK(Primary key) 생성을 원칙으로 함
- InnoDB에서 PK는 Index와 밀접한 관계를 가지므로, 최대한 작은 데이터 타입을 가지도록 유지
- 테이블의 Primary key는 auto_increment를 사용함
- InnoDB에서는 기본키 순서로 데이터가 저장되므로, Random PK 저장 시 불필요한 DISK I/O가 발생 가능
- InnoDB의 PK는 절대 갱신되지 않도록 유지 (갱신 시 갱신된 행 이후 데이터를 하나씩 새 위치로 이동하여야 함)
- 테이블 내 모든 필드에 NOT NULL 속성을 추가하여 추가비용 발생을 막는다
- 정수타입으로 저장가능한 문자열패턴은 최대한 정수타입으로 저장한다
- 데이터 및 인덱스 파일이 커질수록 성능이 저하되므로 Partitioning 유도 PK 존재시 PK내부에 반드시 반드시 Partitioning 조건을 포함하여야 함
- 테이블 예제
1) CREATE으로 설정 (생성)
CREATE TABLE 테이블이름
(
필드이름 필드타입
id int(11) NOT NULL auto_increment primary key,
.......,
[CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)
)
2) ALTER문으로 설정 (추가, 수정)
ALTER TABLE 테이블이름
ADD 필드이름 필드타입 PRIMARY_KEY
3) 제약조건 삭제
ALTER TABLE 테이블이름 DROP PRIMARY_KEY;
FOREIGN KEY
1. 특징
- 테이블을 연결하는 키이다.
- 외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조하여 레코드가 입력된다.
- 외래키가 포함된 테이블을 자식 테이블이라고 하고, 외래키 값을 제공하는 테이블을 부모 테이블이라고 한다.
- 하나의 테이블을 다른 테이블에 의존하게 만드는 성격을 지님
- 주의사항
- Foreign key 키를 설정할 때에는 참조되는 (부모)테이블의 필드가 반드시 UNIQUE(고유키)나 PRIMARY KEY(기본키)가 설정되어 있어야 함
- 외래키 키 값은 NULL이거나 부모 테이블의 기본키 값과 동일해야 함 (참조 무결성 제약조건)
- 부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있음
- 부모 테이블의 기본키, 고유키가 여러개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있음
- 외래키로 지정할 두 테이블은 같은 데이터 타입이어야 함
- 테이블 예제
1) CREAT문으로 설정 (생성)
CREATE TABLE 테이블이름
(
필드이름 필드타입
id VARCHAR(25),
......,
[CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)
)
2) ALTER문으로 설정 (수정)
ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)
3) 제약조건 삭제
ALTER TABLE 테이블이름
DROP FOREIGN KEY 제약조건이름
- 외래키 옵션
- 외래키에 의해 참조되는 테이블에서 데이터의 수정이나 삭제가 발새하면, 참조하고 있는 테이블의 데이터도 영향을 받음. 이때 참조하고 있는 테이블의 동작을 ON DELETE, ONUPDATE 키워드를 이용하여 미리 설정할 수 있음
1) ON DELETE
CASCADE: 참조되는 테이블(부모)의 데이터를 삭제하면, 참조하는 테이블(자식)에서도 데이터 삭제가 이루어짐.
SET NULL: 참조되는 테이블(부모)의 데이터를 삭제하면, 참조하는 테이블(자식)의 데이터는 NULL로 변경
NO ACTION: 참조되는 테이블(부모)의 데이터를 삭제해도, 참조하는 테이블(자식)의 데이터는 변경되지 않음
SET DEFAULT: 참조되는 테이블(부모)의 데이터를 삭제하면, 참조하는 테이블(자식)의 데이터는 필드의 기본값으로 설정됨
RESTIRICT: 참조되는 테이블(부모)의 데이터가 남아있으면, 참조하는 테이블(자식)의 데이터는 삭제할 수 없음
2) ON UPDATE
CASCADE: 참조되는 테이블(부모)의 데이터를 수정하면, 참조하는 테이블(자식)에서도 데이터 수정이 이루어짐.
SET NULL: 참조되는 테이블(부모)의 데이터를 수정하면, 참조하는 테이블(자식)의 데이터는 NULL로 변경
NO ACTION: 참조되는 테이블(부모)의 데이터를 수정해도, 참조하는 테이블(자식)의 데이터는 변경되지 않음
SET DEFAULT: 참조되는 테이블(부모)의 데이터를 수정하면, 참조하는 테이블(자식)의 데이터는 필드의 기본값으로 설정됨
RESTIRICT: 참조되는 테이블(부모)의 데이터가 남아있으면, 참조하는 테이블(자식)의 데이터는 수정할 수 없음