Db 기본키 외래키 - db gibonki oelaeki

Key

슈퍼키 super key

: 해당 개체를 고유하게 식별할 수 있는 attribute의 ''집합''.

  • [주민번호 앞자리, 주민번호 뒷자리, 이름]

후보키 candidate key

: 슈퍼키의 부분집합. 슈퍼키에서 군더더기를 제거한 것.

(수학적 정의) ''모든 다른 attribute들을 함수적으로 결정하는 attribute''

  • 슈퍼키의 구성 attribute 중 하나라도 제거하면 슈퍼키가 아닌 것.

  • 후보키 중에 하나가 PK가 될 수 있다.

  • [주민번호 앞자리, 주민번호 뒷자리, 이름]에서 [주민번호 앞자리, 주민번호 뒷자리]가 후보키에 해당한다.

기본키 primary key

: 여러 후보키 중 대표적인 키 하나를 선택해 테이블의 기본 키로 만든다.

인공 키 vs 자연 키

인공 키 : 현실에 존재하지 않는 속성으로 만든 키

  • long id

자연 키 natural key : 현실에 존재하는 속성으로 만든 키

  • 주민등록번호

기본키와 외래키

PK : primary key. (=기본키) 엔티티를 식별하는 대표키. unique하며 null일 수 없다

FK : foreign key. 다른 테이블의 PK를 참조하는 키. 참조하는 PK와 동일한 domain을 갖는다.

참고 : 외래키란?, MySQL Foreign Key

  • 중복 데이터 제거를 위해 테이블을 분리할 때, 반드시 필요한 개념
  • '한 테이블에 존재하는 다른 테이블의 정보'이기 때문에 외래키라고 부른다.

외래키의 역할

  • 두 테이블을 연결해 주는 다리 역할을 한다.
  • 참조하는 테이블의 무결성을 높여 준다 (참조무결성)

Db 기본키 외래키 - db gibonki oelaeki

이번 프로젝트의 경우 dish테이블에서 categoryid를 참조했다. (외래키 = category_id)

MySQL에서 외래키 선언

dish테이블은 아래와 같이 선언되었다.

create table dish (
    id varchar(5) not null,
    main_image varchar(100) not null,
    ...
    stock int not null,
    point int not null,
    primary key (id),
    foreign key (category_id) references category (id)
);

FOREIGN KEY (외래키이름) REFERENCES (외래키테이블이름) (그테이블에서의이름)

기본키 - Primary Key


테이블의 각 row 를 유일성과 최소성을 만족시키면서 식별할 수 있는 후보키 중에 선택한 Main key 

  • Candidate Key(후보키)중에 선택한 Main Key
  • *유일성과 *최소성을 만족
  • 중복되지 않는 고유값만 허용
  • NULL 값 허용하지 않음
  • 테이블당 하나의 기본키만 지정 가능

*Candidate Key ?

: 관계형 데이터베이스에서 *릴레이션(Relation)의 튜플을 유일하게 식별할 수 있는 속성 또는 속성의 집합 중, 다음 두 성질을 만족해야 함

  • 유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다.
  • 최소성(minimality) : 유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다. 즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.

*릴레이션 : 테이블이라고 이해

1. CREATE 문으로 생성

1. CREATE TABLE 테이블이름

(
    필드이름 필드타입 PRIMARY KEY,

    ...
)

2. CREATE TABLE 테이블이름

(

    필드이름 필드타입,

    ...

    [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

)
-- 기본키 넣는 방법 1
CREATE TABLE people (
  ID INT PRIMARY KEY,
  className VARCHAR(5),
  Name VARCHAR(10)
);

-- 기본키 넣는 방법 2
CREATE TABLE people (
  ID INT,
  className VARCHAR(5),
  Name VARCHAR(10)
  PRIMARY KEY (ID)
);

2. ALTER 문으로 PRIMARY KEY 수정

추가 - 테이블에 새로운 필드를 추가할 때 해당 필드를 기본 키로 설정하는 방법

ALTER TABLE 테이블이름
ADD 필드이름 필드타입 PRIMARY KEY

ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

변경 - 기존에 존재하는 필드를 기본 키로 설정하는 방법

ALTER TABLE 테이블이름
MODIFY COLUMN 필드이름 필드타입 PRIMARY KEY

ALTER TABLE 테이블이름
MODIFY COLUMN [CONSTRAINT 제약조건이름] PRIMARY KEY (필드이름)

삭제 - 해당 테이블 Primary key 제약 조건을 삭제

ALTER TABLE 테이블이름
DROP PRIMARY KEY

* Unique 제약 조건


- 해당 필드는 서로 다른 값을 가져야 한다. (중복 저장 x)

- NULL 값 가능

1. CREATE TABLE 테이블이름

(
    필드명 필드타입 UNIQUE,

    ...
)

2. CREATE TABLE 테이블이름

(
    필드이름 필드타입,

    ...,

    [CONSTRAINT 제약조건이름] UNIQUE (필드이름)
)
CREATE TABLE people (
  ID INT PRIMARY KEY,
  className VARCHAR(5),
  Name VARCHAR(10)
  UNIQUE (ID)
);

외래키 - Foreign Key


  • 다른 테이블의 Primary Key 와 연결되는(참조되는) 테이블의 column 을 의미
  • 한 테이블을 다른 테이블과 연결해주는 역할
  • 하나의 테이블을 다른 테이블에 의존하게 만듬
  • 외래키 제약 조건을 설정할 때 참조되는 테이블은 UNIQUE나 PRIMARY KEY 제약 조건 설정 필수

외래 키 추가

ALTER TABLE _자식테이블이름
  ADD CONSTRAINT _제약조건이름
  FOREIGN KEY ( _자식테이블외래키 )
  REFERENCES 부모테이블명 ( _부모테이블기본키 )
  -- ON DELETE _삭제시제약 
  -- ON UPDATE _수정시제약

외래 키 삭제

ALTER TABLE _자식테이블명 DROP FOREIGN KEY _자식테이블외래키

- 외래키는 NULL값이거나 또는 부모 테이블의 기본 키 값과 같아야 합니다. 그렇지 않으면 에러가 발생합니다.

외래 키 제약 - ON UPDATE, ON DELETE

 FOREIGN KEY 제약 조건에 의해 참조되는 테이블의 데이터의 수정이나 삭제가 발생하면, 참조하고 있는 테이블의 데이터도 같이 영향을 받습니다. 이때 참조하고 있는 테이블의 동작은 다음 키워드를 사용하여 제약 조건에서 미리 설정을 할  수 있습니다.

제약 설명 비고
NO ACTION, RESTRICT 자식 테이블에 해당 외래키가 있을 때 수정/삭제 되지 않음  
CASCADE 자식 테이블의 해당 행도 수정/삭제  
SET NULL 자식 테이블의 외래키를 NULL로 자식 외래키가 NOT NULL일 시 설정 불가
SET DEFAULT 자식 테이블의 외래키를 기본값으로 InnoDB 엔진에서 사용 불가

참고

https://prinha.tistory.com/

얄코 강의