본문으로 건너뛰기
SQL 기초집LESSON 13

PRIMARY KEY, FOREIGN KEY와 관계 설계

난이도입문 → 초급
예상 시간30분
선수지식이전 강의

13강. PRIMARY KEY, FOREIGN KEY와 관계 설계

1. 이번 강의에서 해결할 문제

존재하지 않는 플레이어나 경기를 참조하는 결과가 저장되면 통계의 신뢰성이 깨집니다. 식별 키와 참조 무결성으로 유효한 관계만 허용합니다.

2. 학습 목표

3. 핵심 개념

PRIMARY KEY는 행을 식별하고 FOREIGN KEY는 부모 행의 키를 참조합니다. players와 games는 N:M이므로 match_results가 두 키를 연결하면서 점수와 승패 같은 관계 속성을 저장합니다. SQLite는 연결마다 PRAGMA foreign_keys = ON을 명시해야 합니다.

4. 단계별 SQL 예시

대상 테이블: 신규 match_results, character_stats; 기존 players, games 참조
파일 경로: C:\dev\game-ranking-db\sql\13-relations.sql

sql/13-relations.sql
PRAGMA foreign_keys = ON;

CREATE TABLE IF NOT EXISTS match_results (
result_id INTEGER PRIMARY KEY,
game_id INTEGER NOT NULL REFERENCES games(game_id) ON DELETE RESTRICT,
player_id INTEGER NOT NULL REFERENCES players(player_id) ON DELETE RESTRICT,
score INTEGER NOT NULL CHECK (score >= 0),
result TEXT NOT NULL CHECK (result IN ('win', 'loss', 'draw')),
rank_position INTEGER NOT NULL CHECK (rank_position > 0),
UNIQUE (game_id, player_id)
) STRICT;

CREATE TABLE IF NOT EXISTS character_stats (
stat_id INTEGER PRIMARY KEY,
result_id INTEGER NOT NULL UNIQUE
REFERENCES match_results(result_id) ON DELETE CASCADE,
character_name TEXT NOT NULL,
damage_dealt INTEGER NOT NULL CHECK (damage_dealt >= 0),
healing_done INTEGER NOT NULL DEFAULT 0 CHECK (healing_done >= 0)
) STRICT;

INSERT INTO match_results (game_id, player_id, score, result, rank_position) VALUES
(1, 1, 1250, 'win', 1), (1, 2, 910, 'loss', 2),
(2, 1, 800, 'loss', 2), (2, 3, 1100, 'win', 1),
(3, 2, 1400, 'win', 1), (3, 4, 1000, 'loss', 2);

INSERT INTO character_stats (result_id, character_name, damage_dealt, healing_done) VALUES
(1, 'Knight', 5200, 300), (2, 'Mage', 4800, 0),
(3, 'Knight', 3900, 250), (4, 'Archer', 6100, 0),
(5, 'Mage', 6800, 0), (6, 'Priest', 2200, 4900);

PRAGMA foreign_key_check;
PowerShell · 실행 순서
sqlite3 .\data\game_ranking.db ".read .\sql\13-relations.sql"
sqlite3 .\data\game_ranking.db "PRAGMA foreign_keys = ON; PRAGMA foreign_key_check;"

5. 쿼리가 동작하는 이유

외래 키는 부모 키가 존재하는지 검사합니다. match_results의 복합 UNIQUE는 같은 플레이어가 한 경기에 두 결과를 갖지 못하게 합니다. character_stats의 result_id UNIQUE는 현재 설계에서 결과 한 건당 캐릭터 통계 한 건을 강제합니다.

6. 자주 하는 실수와 안전한 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

키와 관계 점검

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1orders 테이블의 각 행을 고유하게 식별하는 열에 가장 알맞은 제약은 무엇인가요?
  2. 문제 2여러 학생이 여러 강의를 수강하는 N:M 관계를 표현하는 일반적인 방법은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

13강. PRIMARY KEY, FOREIGN KEY와 관계 설계 미완료 상태