외래 키

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

외래 키(외부 키, foreign key)는 관계형 데이터베이스에서 테이블 사이에 관계 변수를 관장하는 키이다.

개요[편집]

외래 키는 참조하는 측의 관계 변수로 1개의 속성(열, column) 또는 속성의 집합을 분류하고, 참조하는 측의 관계 변수는 참조되는 측의 관계 변수의 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 데이터베이스 관리 시스템(SQL DBMS)은 참조 정합성 제약을 강제 적용하기 위해 DBMS는 참조되는 측 관계 변수의 행을 삭제(또는 갱신)하는 경우에도, 데이터 정합성을 유지해야 한다. 그 때, 참조하는 측의 관계 변수에 행이 남아 있는 경우, 참조 정합성을 고려해야 한다. 데이터베이스 언어표준 SQL:2003에는 그러한 경우에 발생시키는 5종류의 참조 조작이 규정되어 있다.

  • CASCADE
  • RESTRICT
  • NO ACTION
  • SET NULL
  • SET DEFAULT

CASCADE[편집]

참조되는 측 관계 변수의 행이 삭제되었을 경우에는 참조하는 측 관계 변수와 대응되는 모든 행들이 삭제된다. 참조되는 측 관계 변수의 행이 갱신되었을 경우에는 참조하는 측 관계 변수의 외래 키 값은 같은 값으로 갱신된다.

RESTRICT[편집]

참조하는 측 관계 변수의 행이 남아 있는 경우에는 참조되는 측의 행을 갱신하거나 삭제할 수 없다. 이 경우에는 데이터 변경이 이루어지지 않는다.

NO ACTION[편집]

참조되는 측 관계 변수에 대해 UPDATE 또는 DELETE가 실행된다. DBMS에서 SQL 문장의 실행 종료시에 참조 정합성을 만족하는지를 검사한다. RESTRICT와 차이점은, 트리거 또는 SQL 문장의 시멘틱스 자체가 외래 키의 제약을 채울 것이라는 데에 있다. 이 때는 SQL 문장 실행이 성공한다. 외래 키의 제약이 만족되지 않은 경우에는 SQL 문장 실행이 실패한다.

SET NULL[편집]

참조되는 측 관계 변수에 대해 행이 갱신 또는 삭제되었을 경우, 참조하는 측 관계 변수의 행에 대한 외래 키 값은 NULL로 설정된다. 이 옵션은 참조하는 측 관계 변수의 외래 키에 NULL을 설정할 수 있는 경우에만 가능하다. NULL의 시멘틱스에 의해, 참조하는 측 관계 변수에 대해 NULL이 있는 행는, 참조되는 측 관계 변수의 행을 필요로 하지 않는다.

SET DEFAULT[편집]

SET NULL과 비슷하지만, 참조되는 측 관계 변수의 행이 갱신 또는 삭제되었을 경우, 참조하는 측 관계 변수의 외래 키 값은 속성의 기본값(default)으로 설정된다.

같이 보기[편집]