기본키(PK)와 외래키(FK)

2ERO·2022년 9월 27일
0

MySQL

목록 보기
1/1

PRIMIRY KEY
1. 특징

  • NULL 값을 가질 수 없음
  • UNIQUE 제약조건
  1. 주의사항
  • 로그성 테이블에도 기본적인 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. 테이블 예제
    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. 특징

  • 테이블을 연결하는 키이다.
  • 외래 키가 설정된 테이블에 레코드를 입력하면, 기준이 되는 테이블의 내용을 참조하여 레코드가 입력된다.
  • 외래키가 포함된 테이블을 자식 테이블이라고 하고, 외래키 값을 제공하는 테이블을 부모 테이블이라고 한다.
  • 하나의 테이블을 다른 테이블에 의존하게 만드는 성격을 지님
  1. 주의사항
  • Foreign key 키를 설정할 때에는 참조되는 (부모)테이블의 필드가 반드시 UNIQUE(고유키)나 PRIMARY KEY(기본키)가 설정되어 있어야 함
  • 외래키 키 값은 NULL이거나 부모 테이블의 기본키 값과 동일해야 함 (참조 무결성 제약조건)
  • 부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있음
  • 부모 테이블의 기본키, 고유키가 여러개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있음
  • 외래키로 지정할 두 테이블은 같은 데이터 타입이어야 함
  1. 테이블 예제
    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 제약조건이름

  1. 외래키 옵션
  • 외래키에 의해 참조되는 테이블에서 데이터의 수정이나 삭제가 발새하면, 참조하고 있는 테이블의 데이터도 영향을 받음. 이때 참조하고 있는 테이블의 동작을 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: 참조되는 테이블(부모)의 데이터가 남아있으면, 참조하는 테이블(자식)의 데이터는 수정할 수 없음

profile
이것저것 간단하게 적어놓는 블로그

0개의 댓글