PK(Primary Key) 와 FK(Foreign Key)
기본키
데이터베이스 테이블에서 각 행을 고유하게 식별하는 열 또는 열의 조합이다.
기본 키는 데이터의 고유성을 보장하며, 테이블의 엔터티 무결성을 적용하는 데 필수적이다.
기본 키 제약 조건
- 기본 키 제약 조건은 테이블에 대해 정의되며, 데이터베이스 엔진은 기본 키 열에 대해 고유 인덱스를 자동으로 생성하여 데이터의 고유성을 적용한다.
- 기본 키는 테이블당 하나만 정의할 수 있으며, 모든 열은 NOT NULL로 설정되어야 합니다. 즉 기본 키를 구성하는 열은 NULL 값을 가질 수 없다.
- 기본 키는 최대 16개의 열과 900바이트의 총 키 길이를 초과할 수 없다.
기본 키의 조건
- 기본 키 제약 조건에 의해 생성된 인덱스 수는 비클러스터형 인덱스 999개, 클러스터형 인덱스 1개로 제한된다.
- 제약 조건 내에서 정의된 모든 열은 NULL을 허용하지 않으며, 기본 키 제약 조건에 참여하는 모든 열의 NULL 허용 여부는 기본적으로 NULL이 아닌 것으로 설정된다.
- 기본 키는 복합 키로 정의될 수 있으며, 이 경우 여러 열의 조합이 고유해야 한다. 예를 들어, Purchasing.ProductVendor 테이블의 ProductID와 VendorID 열은 복합 기본 키를 구성하여 중복 행이 삽되지 않도록 한다.
https://learn.microsoft.com/ko-kr/sql/relational-databases/tables/primary-and-foreign-key-constraints?view=sql-server-ver16
기본 및 외래 키 제약 조건 - SQL Server
데이터베이스 테이블에서 데이터 무결성을 적용하는 데 사용되는 중요한 개체인 기본 및 외래 키 제약 조건에 대해 알아봅니다.
learn.microsoft.com
외래키
외래 키는 한 테이블의 열이 다른 테이블의 기본 키를 참조하는 열 또는 열의 조합이다. 이를 통해 두 테이블 간의 논리적 관계를 설정하고, 외래 키 테이블에 저장할 수 있는 데이터를 제어한다.
외래 키 제약 조건
- 외래 키 제약 조건은 두 테이블 간의 링크를 설정하여 데이터 무결성을 보장한다.
- 예를 들어, Sales.SalesOrderHeader 테이블의 SalesPersonID 열이 SalesPerson 테이블의 기본 키와 일치할 때, 이 두 테이블 간의 관계가 형성된다.
- 만약 SalesPerson 테이블에 해당하는 SalesPersonID 값이 없다면, SalesOrderHeader 테이블에 해당 값을 삽입할 수 없다.
외래 키의 조건
- 외래 키 참조가 있는 테이블은 최대 253개의 외래 키 참조로 제한된다. 그러나 SQL Server 2016(13.x) 이상에서는 다르다. (지금은 확 와닿지 않으므로 여기까지 기술)
- 외래 키 제약 조건을 설정하면, 기본 키 테이블의 데이터가 변경될 때 외래 키 테이블의 데이터도 영향을 받을 수 있다. 예를 들어, 기본 키가 삭제되면 외래 키가 해당 기본 키를 참조하고 있는 경우, 외래 키 제약 조건에 의해 삭젝 실패할 수 있다.
외래 키 인덱스
외래 키 제약 조건을 만들면 자동으로 인덱스가 생성되지 않는다. 그러나 외래 키 열에 인덱스를 수동으로 추가하는 것이 유용할 수 있다. 인덱스가 있으면 외래 키 테이블에서 관련 데이터를 빠르게 찾을 수 있어 쿼리 성능이 향상된다.
참조 무결성
- 외래 키 제약 조건의 주요 목적은 외래 키 테이블에 저장할 수 있는 데이터를 제어하는 것이다.
- 기본 키 테이블의 데이터가 변경될 때 외래 키 테이블의 데이터에 대한 링크가 무효화되지 않도록 보장한다. 예를 들어, 기본 키가 삭제되면 외래 키 테이블에서 해당 외래 키 값을 가진 행이 존재할 수 없도록 한다.
연계 참조 무결성
- 연계 참조 무결성 제약 조건을 사용하면 외래 키가 가리키는 기본 키를 삭제하거나 업데이트할 때 데이터베이스 엔진이 수행하는 작업을 정의할 수 있다.
- 주요 동작으로는 NO ACTION, CASCADE, SET NULL, SET DEFAULT가 있다.
- 이들 각각은 부모 테이블에서 행이 삭제되거나 업데이트될 때 외래 키 테이블에서 어떻게 처리할지를 결정한다.