3.3. 참조키

2장에서 사용한 weather, cities 테이블의 관계를 다시 한 번 살펴봅시다. 이 두 테이블 간에 아무른 관계 조건이 없다고 가정한다면, 다음과 같은 문제점들이 발생할 것입니다. 두 테이블을 도시명으로 조인해서 자료를 찾고자 하는데, inner join 일 경우는 사용자가 한 테이블에서 도시명을 잘못 입력했다면, 그 자료는 완벽하게 찾을 수 없는 사태가 발생하겠지요. 또 한 테이블에서 도시명을 바꾸었을 경우도 그렇게 될 것이고, 또 cities 테이블에서 특정 도시 정보가 삭제가 되어버리면 weather 테이블 안에 있는 그 도시의 날씨 정보가 전혀 쓸 모 없게 되어버립니다. 그래서, weather 테이블에 자료를 입력할 때는 반드시 cities 테이블에 있는 도시명을 사용해야지만 입력할 수 있도록 해야겠다고 테이블 관계를 다시 정의합니다. 이것을 RDBMS 용어로 참조 무결성(referential integrity) 이라고 합니다. 이것을 구현하기 위해서 단순하게 생각해서 weather 테이블에 자료를 입력하기 전에, 먼저 입력될 도시명이 cities 테이블에 있는지 살펴보고 있다면 입력작업을 계속 진행하고, 없다면 입력작업은 중지하도록 프로그램 만들 수 있겠지요. 처음에 아무런 참조 무결성 조건이 없는 상태보다는 좀 더 안전해졌지만, 아직도 많은 문제점들을 안고 있습니다 (앞에서 이야기한 update, delete 관련 작업에서). 이런 문제를 PostgreSQL에서는 다음과 같이 간단히 참조키를 지정함으로 해결할 수 있습니다.

이것을 구현하는 테이블 생성 스크립트는 다음과 같습니다:

CREATE TABLE cities (
        city     varchar(80) primary key,
        location point
);

CREATE TABLE weather (
        city      varchar(80) references cities(city),
        temp_lo   int,
        temp_hi   int,
        prcp      real,
        date      date
);

테이블을 만들었으면, 이제 잘못된 자료를 넣어봅시다:

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".

윗 오류 메시지는 weather 테이블을 대상으로 하는 자료입력 또는 자료 변경 작업이 weather_city_fkey 제약조건을 위반했으며, 자세한 내용으로 그 제약조건의 상위 테이블인 cities 테이블의 city 칼럼값으로 Berkeley인 자료가 없다고 알려주는 것입니다.

참조키 기능은 응용 프로그램에서 해야할 일들을 대폭 줄여줌과 동시에 자료의 관계성을 보다 견고하게 만들어줍니다. 참조키 기능은 여기서 언급한 것보다 훨씬 많은 것을 제공하고 있습니다. 이 자습서에서 그 세세한 기능들에 대해서는 언급하지 않겠습니다. 자세한 사항은 5장을 참조하십시오.