외래 키
외래 키 (Foreign Keys)
앞서 만든 weather와 cities 테이블을 떠올려보세요. 한 가지 짚고 넘어가야 할 문제가 있어요. "누군가 cities 테이블에 일치하는 항목이 없는 행을 weather 테이블에 넣는 일"을 막고 싶다면 어떻게 해야 할까요? 이걸 데이터의 **참조 무결성(referential integrity)**을 유지한다고 해요. 이번에는 PostgreSQL이 이걸 어떻게 자동으로 지켜주는지 배워볼게요.
참조 무결성 문제 (The referential integrity problem)
2장의 weather와 cities 테이블을 떠올려볼게요. 이런 문제를 생각해봐요: cities 테이블에 일치하는 항목이 없는 행을 weather 테이블에 아무도 넣을 수 없게 만들고 싶다. 이것을 데이터의 **참조 무결성(referential integrity)**을 유지한다고 해요.
단순한 데이터베이스 시스템에서 이를 구현하려면(구현한다면 말이죠) 먼저 cities 테이블을 조사해서 일치하는 기록이 있는지 확인한 다음, 새 weather 기록을 넣거나 거부해야 해요. 이 접근 방식은 문제가 많고 아주 불편해요. 그래서 PostgreSQL이 이런 일을 대신 해줘요.
외래 키로 테이블 선언하기 (Declaring tables with a foreign key)
테이블을 새로 선언하면 이렇게 생겼어요:
CREATE TABLE cities (
name varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(name),
temp_lo int,
temp_hi int,
prcp real,
date date
);
핵심은 두 부분이에요:
cities테이블에서name을 **primary key(기본 키)**로 지정했어요. 이제name은 각 행을 유일하게 식별하는 기준이 돼요.weather테이블의city컬럼을 **references cities(name)**로 선언했어요. 이게 바로 **외래 키(foreign key)**예요. PostgreSQL이 "weather.city에 들어가는 값은 반드시cities.name에 존재해야 한다"는 규칙을 강제하게 되죠.
이제 잘못된 기록을 넣어보세요:
INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR: insert or update on table "weather" violates foreign key constraint "weather_city_fkey"
DETAIL: Key (city)=(Berkeley) is not present in table "cities".
Berkeley라는 도시가 cities 테이블에 없으니 PostgreSQL이 거부하면서 위 에러를 뱉었어요. 데이터 무결성이 지켜진 거예요.
더 보려면 (Going further)
외래 키의 동작은 애플리케이션에 맞게 아주 세밀하게 조정할 수 있어요. 이 튜토리얼에서는 이 간단한 예제 이상으로 나아가진 않고, 자세한 내용은 5장을 참고하라고 알려드릴게요. 외래 키를 올바르게 사용하면 데이터베이스 애플리케이션의 품질이 확실히 좋아지니, 꼭 배워두기를 강력히 권해요.
더 알아보기 (Learn more)
- 뷰 (Views) — 이전 단계
- 트랜잭션 (Transactions) — 다음 단계로 넘어가요
- 5장: Data Definition — 외래 키를 포함한 테이블 정의 더 깊게