제약조건 PK, FK, UK (Primary, Foreign, Unique Key)

최석훈·2025년 10월 16일

데이터베이스

목록 보기
5/18

데이터베이스의 제약 조건

테이블 단위에서 데이터의 무결성을 보장하는 규칙
테이블 수정 작업하는 경우에 잘못 된 트랜잭션 수행을 방지하는 역할을 한다.
테이블 간 제약 조건이 있어서 종속성이 있는 경우 테이블 삭제를 방지한다.

기본키, PK(Primary Key)

개념:
테이블 내에서 각 레코드를 고유하게 식별할 수 있는 열(또는 열의 조합)입니다. 기본 키가 설정된 열은 중복된 값을 가질 수 없으며, NULL 값을 허용하지 않습니다.

특징:

  • 각 테이블에 하나의 기본 키만 정의할 수 있습니다.

  • 기본 키로 지정된 열은 해당 테이블에서 각 행을 고유하게 식별합니다.

  • 중복된 데이터 입력이 불가능하며, 데이터베이스에서 데이터 무결성을 보장합니다.

예시:
학생 테이블에서 학생ID를 기본 키로 설정하면, 각 학생을 고유하게 식별할 수 있습니다.

CREATE 문으로 PK 설정

CREATE TABLE 테이블명
( 
  필드명 필드타입 PRIMARY KEY,
  --ex ) ID Strimg PRIMARY KEY
  필드명 필드타입,
  필드명 필드타입
);

외래키, FK(Foreign Key)

개념:
한 테이블의 열이 다른 테이블의 기본 키를 참조하여, 테이블 간의 관계를 정의하는 제약 조건입니다. 외래 키는 두 테이블 간의 참조 무결성을 유지합니다.

특징:

  • 외래 키가 설정된 열의 값은 참조하는 테이블의 기본 키 값과 일치해야 합니다.

  • 부모 테이블에서 기본 키 값이 삭제되거나 변경될 때, 외래 키가 참조하는 자식 테이블에 영향을 미칠 수 있습니다.

  • 외래 키는 부모 테이블의 기본 키 값이 아닌 값을 허용하지 않아 데이터 무결성을 유지합니다.

예시:
수강 기록 테이블의 학생ID가 학생 테이블의 학생ID를 참조하는 외래 키로 설정되면, 학생 테이블에 존재하지 않는 학생 ID는 수강 기록 테이블에 입력할 수 없습니다.

외래 키 동작 제어 옵션

옵션설명
ON DELETE CASCADE부모 테이블의 레코드가 삭제되면 자식 테이블의 관련 레코드도 함께 삭제
ON DELETE SET NULL부모 레코드 삭제 시 자식 테이블의 외래 키 값을 NULL로 설정
ON DELETE RESTRICT부모 레코드에 자식이 존재하면 삭제 불가 (기본값)
ON UPDATE CASCADE부모의 기본 키가 수정되면 자식 테이블도 자동으로 반영
ON UPDATE SET NULL부모 키 수정 시 자식 테이블 외래 키를 NULL로 변경
ON UPDATE RESTRICT부모 키에 자식이 존재하면 수정 불가 (기본값)

동작 Ex)

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50)
);

CREATE TABLE orders (
  id INT PRIMARY KEY,
  user_id INT,
  FOREIGN KEY (user_id)
    REFERENCES users(id)
    ON DELETE CASCADE     -- 유저 삭제 시 주문도 자동 삭제
    ON UPDATE CASCADE     -- 유저 ID 변경 시 주문 테이블도 반영
);

CREATE 문으로 FK 설정

CREATE TABLE 테이블명
( 
 FOREIGN KEY(필드 이름)
 REFERENCES 참조 테이블명(필드 이름)
);  -- FK 문법 사용시에는 FOREIGN KEY 제약 조건을 설정해야 된다.
    --  참조되는 테이블 명은 REFERENCES 뒤에 명시한다. 

고유키, UK(Unique Key)

개념:
특정 열이 고유한 값을 가지도록 보장하는 제약 조건으로, 중복된 값을 허용하지 않습니다. 다만, 고유 키는 NULL 값을 허용할 수 있습니다.

특징:

  • 하나의 테이블에 여러 개의 고유 키를 정의할 수 있습니다.

  • 고유 키 제약 조건이 설정된 열은 데이터가 중복되지 않도록 보장합니다.

  • 기본 키와 달리, NULL 값이 허용될 수 있으나, NULL 값은 하나만 가질 수 있습니다.

예시:
회원 테이블의 이메일 열에 고유 키 제약 조건을 설정하면, 중복된 이메일 주소가 입력되는 것을 방지할 수 있습니다.

CREATE 문으로 UK 설정

CREATE TABLE 테이블명
( 
필드명 필드타입 UNIQUE,
필드명 필드타입,
필드명 필드타입
); 

기본 키(Primary Key) 외래 키(Foreign Key) 고유 키(Unique Key) 차이점

구분기본 키 (Primary Key)외래 키 (Foreign Key)고유 키 (Unique Key)
목적각 레코드를 고유하게 식별다른 테이블의 기본 키 참조 및 관계 형성고유한 데이터 보장 (중복 허용 안 함)
제약 조건중복 및 NULL 값 허용하지 않음참조하는 기본 키와 일치하는 값만 허용중복 불가, NULL 값 허용 가능
테이블 내 개수테이블당 하나만 설정 가능여러 개 설정 가능여러 개 설정 가능
기능고유 식별자로 사용테이블 간 관계와 참조 무결성 유지유일성 보장, 기본 키와 달리 NULL 허용

요약

  • 기본 키(PK): 테이블에서 각 행을 고유하게 식별하고, 중복과 NULL을 허용하지 않습니다.

  • 외래 키(FK): 다른 테이블의 기본 키를 참조하여 테이블 간 관계를 형성하고 참조 무결성을 유지합니다.

  • 고유 키(UK): 특정 열이 중복되지 않도록 보장하며, 기본 키와 달리 NULL 값을 허용할 수 있습니다.

동작예시

-- 부모 테이블
CREATE TABLE teams (
  id INT PRIMARY KEY,
  name VARCHAR(50) UNIQUE NOT NULL
);

-- 자식 테이블
CREATE TABLE users (
  id INT PRIMARY KEY,
  email VARCHAR(100) UNIQUE,
  name VARCHAR(50) NOT NULL,
  team_id INT,
  FOREIGN KEY (team_id) REFERENCES teams(id)
    ON DELETE CASCADE          -- 팀 삭제 시 연쇄 삭제
    ON UPDATE CASCADE          -- 팀 ID 변경 시 자동 반영
);

-- 정상 삽입
INSERT INTO teams VALUES (1, 'Dev Team');
INSERT INTO users VALUES (1, 'test@test.com', '홍길동', 1);

-- 제약조건 위반 예시
INSERT INTO users VALUES (1, 'test2@test.com', '김철수', 1);
-- 에러: Duplicate entry '1' for key 'PRIMARY'

INSERT INTO users VALUES (2, 'test@test.com', '이영희', 1);
-- 에러: Duplicate entry 'test@test.com' for key 'email'

INSERT INTO users VALUES (2, 'test2@test.com', '박민수', 999);
-- 에러: Cannot add or update a child row (존재하지 않는 team_id)
profile
기술 노트 블로그 (2025.09.01~)

2개의 댓글

comment-user-thumbnail
2025년 10월 16일

개념 설명이랑 표 정리는 잘 되어 있는데,
제약조건이 실제로 어떻게 동작하는지 보여주는 예시 추가하면 좋겠음.

-- 부모 테이블
CREATE TABLE teams (
  id INT PRIMARY KEY,
  name VARCHAR(50) UNIQUE NOT NULL
);

-- 자식 테이블
CREATE TABLE users (
  id INT PRIMARY KEY,
  email VARCHAR(100) UNIQUE,
  name VARCHAR(50) NOT NULL,
  team_id INT,
  FOREIGN KEY (team_id) REFERENCES teams(id)
    ON DELETE CASCADE          -- 팀 삭제 시 연쇄 삭제
    ON UPDATE CASCADE          -- 팀 ID 변경 시 자동 반영
);

-- 정상 삽입
INSERT INTO teams VALUES (1, 'Dev Team');
INSERT INTO users VALUES (1, 'test@test.com', '홍길동', 1);

-- 제약조건 위반 예시
INSERT INTO users VALUES (1, 'test2@test.com', '김철수', 1);
-- 에러: Duplicate entry '1' for key 'PRIMARY'

INSERT INTO users VALUES (2, 'test@test.com', '이영희', 1);
-- 에러: Duplicate entry 'test@test.com' for key 'email'

INSERT INTO users VALUES (2, 'test2@test.com', '박민수', 999);
-- 에러: Cannot add or update a child row (존재하지 않는 team_id)

이런 식으로 직접 실행해보고 에러 확인해봐야
제약조건이 왜 필요한지, 어떻게 동작하는지 명확해짐.

ON DELETE CASCADE, ON UPDATE CASCADE 같은 옵션도 중요한데 빠져있음.
참조 관계 있을 때 부모 삭제되면 자식도 같이 삭제할지,
에러 발생시킬지 결정해야 하는데 이 옵션 모르면 설계 못함.

1개의 답글