FOREIGN KEY 제약 조건
외래 키(FK)는 두 테이블의 데이터 간 연결을 설정하고 강제 적용하는 데 사용되는 열입니다. 테이블을 만들거나 수정할 때 FOREIGN KEY 제약 조건을 정의하여 외래 키를 만들 수 있습니다.
외래 키 참조에서는 한 테이블의 기본 키 값을 가지고 있는 열을 다른 테이블의 열이 참조할 때 두 테이블 간에 연결이 생성됩니다. 이때 두 번째 테이블에 추가되는 열이 외래 키가 됩니다.
예를 들어 AdventureWorks 데이터베이스의 Sales.SalesOrderHeader 테이블에는 Sales.SalesPerson 테이블에 대한 연결이 생성되는데 이는 판매 주문과 영업 사원 간에 논리적 관계가 있기 때문입니다. SalesOrderHeader 테이블의 SalesPersonID 열은 SalesPerson 테이블의 기본 키 열과 일치합니다. SalesOrderHeader 테이블의 SalesPersonID 열은 SalesPerson 테이블에 대한 외래 키입니다.
FOREIGN KEY 제약 조건은 다른 테이블의 PRIMARY KEY 제약 조건으로 연결될 수도 있고 다른 테이블에 있는 UNIQUE 제약 조건의 열을 참조하도록 정의할 수도 있습니다. FOREIGN KEY 제약 조건은 Null 값을 포함할 수 있습니다. 그러나 복합 FOREIGN KEY 제약 조건의 어떤 열에 Null 값이 포함되면 FOREIGN KEY 제약 조건을 구성하는 값에 대한 유효성 검사가 수행되지 않습니다. 복합 FOREIGN KEY 제약 조건의 모든 값에 대해 유효성을 검사하려면 관련된 모든 열에 NOT NULL을 지정합니다.
[!참고]
FOREIGN KEY 제약 조건은 동일한 데이터베이스 내의 여러 테이블에 있는 열 또는 동일한 테이블 내의 열을 참조할 수 있습니다. 이를 자체 참조 테이블이라고 합니다. 예를 들어 employee_number, employee_name 및 manager_employee_number라는 세 열이 있는 Employee 테이블이 있습니다. 관리자는 사원도 되기 때문에 manager_employee_number 열에서 employee_number 열로 외래 키 관계가 설정됩니다.
참조 무결성
FOREIGN KEY 제약 조건의 기본 목적이 외래 키 테이블에 저장되는 데이터를 제어하는 것이지만 기본 키 테이블의 데이터 변경 사항도 제어할 수 있습니다. 예를 들어 한 영업 사원에 대한 행이 Sales.SalesPerson 테이블에서 삭제되었는데 이 영업 사원의 ID가 Sales.SalesOrderHeader 테이블의 판매 주문에 사용된 경우 두 테이블 간의 관계 무결성이 손상됩니다. SalesPerson 테이블의 데이터에 대한 연결이 끊어졌으므로 삭제된 영업 사원의 판매 주문은 SalesOrderHeader 테이블에서 고아 항목이 됩니다.
FOREIGN KEY 제약 조건은 이런 상황이 발생되지 않도록 합니다. 이 제약 조건은 기본 키 테이블의 데이터를 변경할 때 외래 키 테이블에 있는 데이터로의 연결이 무효화될 가능성이 있으면 그 데이터를 변경하지 못하도록 하여 참조 무결성을 강제 적용합니다. 삭제되거나 변경되는 기본 키 값이 다른 테이블의 FOREIGN KEY 제약 조건 값과 연결되어 있으면 기본 키 테이블의 행을 삭제하거나 기본 키 값을 변경하려는 동작이 수행되지 않습니다. FOREIGN KEY 제약 조건의 행을 제대로 변경하거나 삭제하려면 먼저 외래 키 테이블에 있는 외래 키 데이터를 삭제하거나 변경하여 외래 키를 다른 기본 키 데이터에 연결해야 합니다.
FOREIGN KEY 제약 조건 인덱싱
외래 키에 대해 인덱스를 만들면 다음과 같은 경우 유용합니다.
PRIMARY KEY 제약 조건이 변경되면 연결된 테이블의 FOREIGN KEY 제약 조건도 검사합니다.
외래 키 열은 쿼리에서 한 테이블의 FOREIGN KEY 제약 조건 열을 다른 테이블의 기본 또는 고유 키 열과 연결하여 테이블의 데이터를 병합하는 조인에서 자주 사용됩니다. 데이터베이스 엔진에서는 인덱스를 만들어 외래 키 테이블에 있는 관련 데이터를 빠르게 찾을 수 있습니다. 그러나 반드시 인덱스를 만들 필요는 없습니다. 테이블 간에 PRIMARY KEY 또는 FOREIGN KEY 제약 조건이 정의되지 않더라도 관련된 두 테이블의 데이터를 결합할 수 있습니다. 그러나 두 테이블 간 외래 키 관계가 설정되면 키를 기준으로 하는 쿼리에서 결합할 때 최적화될 수 있습니다. 조인에서의 FOREIGN KEY 제약 조건 사용에 대한 자세한 내용은 조인 기본 사항 및 쿼리 유형 및 인덱스를 참조하십시오.
테이블의 FOREIGN KEY 제약 조건 수
SQL Server에서는 기본적으로 테이블(다른 테이블을 참조하는 테이블)에 설정할 수 있는 FOREIGN KEY 제약 조건의 수나 특정 테이블을 참조하는 다른 테이블에서 소유하는 FOREIGN KEY 제약 조건의 수에 제한을 두지 않습니다. 그러나 실제로는 사용자의 하드웨어 구성과 데이터베이스 및 응용 프로그램의 디자인에 따라 FOREIGN KEY 제약 조건의 수가 제한됩니다. 테이블에 포함되거나 이 테이블을 참조하는 FOREIGN KEY 제약 조건의 수가 각각 253개를 넘지 않도록 하는 것이 좋습니다. 데이터베이스와 응용 프로그램을 디자인할 때는 FOREIGN KEY 제약 조건을 적용하는 데 드는 비용도 고려해야 합니다.