[Database][TIL] Primary Key, Foreign Key

Trippy·2024년 1월 18일

DB

목록 보기
3/5
post-thumbnail

Primary Key(기본 키)

데이터베이스 테이블 내의 모든 레코드에서 고유한 아이디를 제공한다.

pk의 특징

  • 모든 레코드가 서로 다른 값을 가지고 있어 각 레코드를 식별할 수 있다.
  • NULL값이 존재할 수 없다.
  • 레코드의 값은 UNIQUE하다.
  • 텥이블에는 하나의 기본킴나 가질 수 있지만 경우에 따라 1개 이상의 기본키를 정의할 수 있다.

PK의 생성

CREATE TABLE user {
	id int PRIMARY KEY
    }
  • PK로 사용하기를 원하는 컬럼에 PRIMARY KEY 붙여준다.
    단, 이 떄 기본키의 값을 가진 컬럼은 중복값NULL값이 없어야 한다.
  • 기본키를 설정해두면 해당 컬럼에 중복값을 INSERT하려고 할 때 작동하지 않는다.

AUTO_INCREMENT 의 사용

  • PRIMARY KEY의 속성 중 하나.
  • 삽입되는 레코드에 유니크한 값을 자동으로 부여
  • 일반적으로 1부터 증가하며 값을 부여하지만, 별도의 다른 값을 부여 할 수 있다.
CREATE TABLE user {
	id int PRIMARY KEY AUTO_INCREMENT
    }

❓모든 테이블 마다 기본키가 있어야 하나❓

기본 키를 정의하지 않고 테이블을 생성할 수 는 있지만 DB의 제어 및 관리, 최적화를 위해서라면 기본 키를 생성하는 것이 바람직하다.


Foreign Key(왜래 키)

데이터가 일관될 수 있도록 돕는 역할을 한다. 보통은 두 개의 데이터베이스 테이블을 잇고자 기본 키와 함께 사용된다. 일종의 테이블을 연결하는 가상의 다리 역할을 한다

FK의 특징

  • 외부 키는 한 테이블을 필드로, 다른 테이블의 기본를 나타낸다.
  • 왜래 키를 가지고 있는 테이블을 하위 테이블, 기본 키를 가지고 있는 테이블을 참조 테이블, 상위 테이블이라고 한다.
  • 각 외부 키와 기본 키는 1:1관계로 매칭되어야 하며, 기본 키에 존재하지 않는 값이 외부키에 존재할 수 없다.
    -> 왜래 키 제한 표현으로 DB에게 두 테이블 간의 관계를 설정해야 한다.

FK의 제한 표현

FK의 제한 표현의 역할

  • 두 테이블 간의 관계를 정의한다.
  • 기본 키와 존재하지 않는 값을 외래 키에 존재하게 되는 일을 막아준다.
CREATE TABLE country (
country_id integer,
name varchar(50),
population integer);

CREATE TABLE city (
city_id integer,
name varchar(50),
country_id integer);

제한 표현이 없는 상태에서 데이터베이스는 두 테이블간의 관계를 파악하지 못한다. 따라서 우리가 외래키로 설정한 city테이블의 country_id는 기본 키인 country 테이블의 country_id에 존재하지 않는 값을 입력해도 아무런 문제가 없이 실행된다.
이를 방지하고 DB에게 두 테이블간의 관계를 알려주기 위해 제한 표현을 사용한다.

FK의 제한 표현

1. country 테이블에 기본 키 생성하기
DROP TABLE country;
	CREATE TABLE country(
	country_id integer,
 	name varchar(50),
	population integer,
	PRIMARY KEY (country_id) );

2. 기본 키와 외래 키를 정의한 새로운 테이블 생성
DROP TABLE city;
CREATE TABLE city(
	city_id integet,
    name varchar(50),
    country_id integer,
    PRIMARY KEY (city_id),
    FOREIGN KEY (country_id) REFERENCES country(country_id) );

FOREIGN KEY (country_id) REFERENCES country(country_id)

-> FK는 country_id이고 이것은 country(country_id) 참조되었다.

profile
감금 당하고 개발만 하고 싶어요

0개의 댓글