외래 키

관계형 데이터베이스에서 외래 키(외부 키, foreign key)는 한 테이블의 열(column)이 다른 테이블의 기본키(primary key)를 참조하여 두 테이블간의 관계를 설정하고 데이터의 참조 무결성을 유지하는데 쓰인다. 서로 다른 테이블 간에 '논리적 연결 고리' 역할을 한다. 외래 키를 포함하면 자식 테이블(Child Table), 참조 대상인 '기본키'를 포함하면 부모 테이블(Parent Table)이라고 한다.

 개요 

외래 키는 참조하는 테이블에서 1개의 키(속성 또는 속성의 집합)에 해당하고, 참조하는 측의 관계 변수는 참조되는 측의 테이블의 키를 가리킨다. 참조하는 테이블의 속성의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응된다. 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없다. 이러한 참조 관계는 2개의 테이블을 연관시키기 위한 관계 정규화의 본질적인 부분이다. 참조하는 테이블의 행 여러 개가, 참조되는 테이블의 동일한 행을 참조할 수 있다.

참조하는 테이블과 참조되는 테이블이 동일할 수도 있다. 이 경우는 외래 키가 자기 자신을 참조하는 것이다. 이러한 외래 키는 데이터베이스 언어표준 SQL:2003의 「자기 참조」외래 키 혹은 「재귀적」외래 키로 규정되어 있다.

하나의 테이블이 여러 개의 외래 키를 포함할 수 있다. 그리고 이러한 외래 키들은 각각 서로 다른 테이블을 참조할 수 있다. 각각의 외래 키는 관계 데이터베이스 관리 시스템(RDBMS)에 의해 개별적으로 강제 적용된다. 그렇기에 테이블 사이에 연속되는 관련성을 외래 키를 사용해 정의할 수 있다.

설계의 관점에서 '외래 키-기본 키' 관계가 없어야 하는데 있거나, 있어야 하는데 없는 경우가 있다. 이러한 경우, 데이터베이스 설계에 있어 문제를 유발할 수 있다.

 외래 키 정의하기 
외래 키는 데이터베이스 언어 ANSI/ISO SQL 표준에 대해 FOREIGN KEY 제약으로서 규정되어 있다. 이미 존재하는 테이블들에 외래 키 제약을 추가하는 구문은 SQL:2003에 다음과 같이 나와 있다. 또한, 속성(column)의 리스트를 REFERENCES구로 생략하면, 외래 키는 참조된 테이블의 주키를 참조하는 것을 암묵적으로 나타낸다.

ALTER TABLE <table identifier>
   ADD [ CONSTRAINT <constraint identifier> ]
      FOREIGN KEY ( <column expression> {, <column expression>}... )
      REFERENCES <table identifier> [ ( <column expression> {, <column expression>}... ) ]
      [ ON UPDATE <referential action> ]
      [ ON DELETE <referential action> ]

같은 방법으로, 외래 키는 CREATE TABLE SQL 문장의 일부로 정의할 수도 있다.

CREATE TABLE table_name (
   id    INTEGER  PRIMARY KEY,
   col2  CHARACTER VARYING(20),
   col3  INTEGER,
   ...
   CONSTRAINT col3_fk FOREIGN KEY(col3)
      REFERENCING other_table(UNIQUE(key_col) ON DELETE CASCADE,
   ... )

외래 키가 단일 속성만으로부터 구성되는 경우, 아래 구문을 사용하여 외래 키와 그 속성을 지정할 수 있다.

CREATE TABLE table_name (
   id    INTEGER  PRIMARY KEY,
   col2  CHARACTER VARYING(20),
   col3  INTEGER FOREIGN KEY REFERENCES other_table(column_name),
   ... )

 참조 조작 
관계 데이터베이스 관리 시스템(RDBMS) 혹은 SQL 데이터베이스 관리 시스템은 참조 정합성 제약을 강제 적용하기 위해 DBMS는 참조되는 테이블의 행을 삭제(또는 갱신)하는 경우에도, 데이터 정합성을 유지해야 한다. 그 때, 참조하는 테이블에 행이 남아 있는 경우, 참조 정합성을 고려해야 한다. 데이터베이스 언어표준 SQL:2003에는 그러한 경우에 발생시키는 5종류의 참조 조작이 규정되어 있다.

 CASCADE: 참조되는 테이블의 행이 삭제되었을 경우에는 참조하는 테이블과 대응되는 모든 행들이 삭제된다. 참조되는 테이블의 행이 갱신되었을 경우에는 참조하는 테이블의 외래 키 값은 같은 값으로 갱신된다.
 RESTRICT: 참조하는 테이블의 행이 남아 있는 경우에는 참조되는 테이블의 행을 갱신하거나 삭제할 수 없다. 이 경우에는 데이터 변경이 이루어지지 않는다.
 NO ACTION:참조되는 테이블에 대해 UPDATE 또는 DELETE가 실행된다. DBMS에서 SQL 문장의 실행 종료시에 참조 정합성을 만족하는지를 검사한다. RESTRICT와 차이점은, 트리거 또는 SQL 문장의 시멘틱스 자체가 외래 키의 제약을 채울 것이라는 데에 있다. 이 때는 SQL 문장 실행이 성공한다. 외래 키의 제약이 만족되지 않은 경우에는 SQL 문장 실행이 실패한다.
 SET NULL:참조되는 테이블에 대해 행이 갱신 또는 삭제되었을 경우, 참조하는 테이블의 행에 대한 외래 키 값은 NULL로 설정된다. 이 옵션은 참조하는 테이블의 외래 키에 NULL을 설정할 수 있는 경우에만 가능하다. NULL의 시멘틱스에 의해, 참조하는 테이블에 대해 NULL이 있는 행은, 참조되는 테이블의 행을 필요로 하지 않는다.
 SET DEFAULT: SET NULL과 비슷하지만, 참조되는 테이블의 행이 갱신 또는 삭제되었을 경우, 참조하는 테이블의 외래 키 값은 속성의 기본값(default)으로 설정된다.

 같이 보기 
 기본 키
 슈퍼 키
 후보 키
 대리 키

분류:데이터베이스
분류:SQL
분류:데이터베이스 관리 시스템
분류:데이터 모델링