수색…


외래 키 관계 / 제약

외래 키를 사용하면 두 테이블 간의 관계를 정의 할 수 있습니다. 한 (상위) 테이블은 테이블의 행을 고유하게 식별하는 기본 키를 가져야합니다. 다른 (하위) 테이블은 상위 열의 기본 키 값을 가질 수 있습니다. FOREIGN KEY REFERENCES 제약 조건은 하위 테이블의 값이 상위 테이블의 기본 키 값으로 존재해야합니다.

이 예에서는 CompanyId 기본 키가있는 상위 Company 테이블과이 직원이 근무하는 회사의 ID를 가진 하위 Employee 테이블이 있습니다.

create table Company (
   CompanyId int primary key,
   Name nvarchar(200)
)
create table Employee (
    EmployeeId int,
    Name nvarchar(200),
    CompanyId int
        foreign key references Company(companyId)
)

외래 키 참조 는 Employee.CompanyId 열에 삽입 된 값이 Company.CompanyId 열에도 있어야 함을 보장합니다. 또한 자식 테이블에 일치하는 회사 ID가있는 직원이 적어도 한 명이라면 회사 테이블에서 회사를 삭제할 수 없습니다.

FOREIGN KEY 관계는 두 테이블의 행을 "링크 해제"할 수 없도록합니다.

부모 / 자식 행 간의 관계 유지

companyId 1 인 회사 테이블에 하나의 행이 있다고 가정합시다. companyId 1 인 직원 테이블에 행을 삽입 할 수 있습니다.

insert into Employee values (17, 'John', 1)

그러나 CompanyId가없는 직원은 삽입 할 수 없습니다.

insert into Employee values (17, 'John', 111111)

메시지 547, 수준 16, 상태 0, 줄 12 INSERT 문을 FOREIGN KEY 제약 조건 "FK__Employee__Compan__1EE485AA"충돌했습니다. 데이터베이스 "MyDb", 테이블 "dbo.Company", 열 'CompanyId'에서 충돌이 발생했습니다. 그 진술서는 만료되었습니다.

또한이를 참조하는 employee 테이블에 최소한 하나의 하위 행이있는 한 회사 테이블의 s 위 행을 h 제할 수 없습니다.

delete from company where CompanyId = 1

메시지 547, 수준 16, 상태 0, 줄 14 DELETE 문은 REFERENCE 제약 조건 "FK__Employee__Compan__1EE485AA"과 충돌했습니다. 데이터베이스 "MyDb", 테이블 "dbo.Employee", 열 'CompanyId'에서 충돌이 발생했습니다. 그 진술서는 만료되었습니다.

외래 키 관계는 회사 및 직원 행이 "연결 해제"되지 않도록합니다.

기존 테이블에 외래 키 관계 추가

여전히 관계가없는 기존 테이블에 FOREIGN KEY 제약 조건을 추가 할 수 있습니다. Employee table CompanyId 컬럼이 있지만 외래 키 관계가없는 Company와 Employee 테이블이 있다고 상상해보십시오. ALTER TABLE 문을 사용하면 테이블의 다른 테이블과 기본 키를 참조하는 기존 열에 외래 키 제약 조건을 추가 할 수 있습니다.

alter table Employee
    add  foreign key (CompanyId) references Company(CompanyId)

기존 테이블에 외래 키 추가

제약 조건이있는 FOREIGN KEY 열은 아직 관계가없는 기존 테이블에 추가 될 수 있습니다. Employee 테이블에 CompanyId 컬럼이없는 Company 및 Employee 테이블이 있다고 가정 해보십시오. ALTER TABLE 문을 사용하면 테이블의 다른 테이블과 기본 키를 참조하는 외래 키 제약 조건이있는 새 열을 추가 할 수 있습니다.

alter table Employee
    add CompanyId int foreign key references Company(CompanyId)

외래 키 제약 조건에 대한 정보 얻기

sys.foreignkeys 시스템 뷰는 데이터베이스의 모든 외래 키 관계에 대한 정보를 반환합니다.

select name,
 OBJECT_NAME(referenced_object_id) as [parent table],
 OBJECT_NAME(parent_object_id) as [child table],
 delete_referential_action_desc,
 update_referential_action_desc
from sys.foreign_keys


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow