테이블이 기본 키를 외래 키로 사용하는 이유


21

데이터베이스를 살펴보면 기본 키를 외래 키로 사용하는 테이블을 발견했습니다.

계층 구조를 구축하기 위해 테이블에 외래 키가있을 수 있지만 기본 키를 참조하기 위해 다른 열을 사용한다는 것을 알았습니다.

기본 키가 고유하기 때문에이 상황에서 행이 다시 자신을 가리킬 수 없습니까? 내가 이미 줄을 가지고 있다면, 나는 이미 줄을 가지고 있기 때문에 그것은 tautological 링크 인 것 같습니다.

이것이 이루어질 이유가 있습니까?

테이블 자체에 합류

정의의 두 반쪽에 동일한 테이블과 열이 사용되므로 제약 조건이 다이어그램을 보는 것이 아니라 그런 식으로 작성되었다고 확신합니다.


답변:


28

네가 말했듯이. FOREIGN KEY동일한 테이블을 참조 하는 제약 조건은 일반적으로 계층 구조에 대한 것이며 다른 열을 사용하여 기본 키를 참조합니다. 좋은 예는 직원 테이블입니다.

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

따라서이 경우 테이블에서 외부 키로 외래 키가 있습니다. 모든 관리자는 또한 직원이므로 ManagerId실제로 EmployeeId는 관리자의 관리자입니다.

반면에 누군가 EmployeeId가 직원 테이블의 외래 키로 다시 사용 했다는 것은 실수 일 수 있습니다. 테스트를 실행했는데 가능하지만 실제로는 사용되지 않습니다.

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
이 경우 EmployeeId와 관련된 ManagerId에 제약 조건을 설정하면 관리자가 "분리"되어야합니다. 그렇게 설정하면 행을 삭제할 수 없습니다. 내가 그렇게 할 것이라고 말하지는 않지만 응용 프로그램에 관리자가있는 직원에게 의존하면 도움이 될 수 있습니다.
zgr024

6

방금 내 DB에서 이러한 외래 키를 찾았으며 직접 작성해야했습니다. 나는 이것이 우연히 일어난 것이라고 생각합니다. 기본 키가있는 테이블의 컨텍스트 메뉴 (Management Studio, SQL 2014 Express 내)에서 "새 외래 키"를 클릭하면 이미 자체적으로 참조하는 외래 키가 자동으로 생성됩니다. 아래를보십시오 :

여기에 이미지 설명을 입력하십시오

그런 다음 새 것을 추가하는 대신 해당 것을 변경해야한다는 것을 알지 못하면 그대로 유지됩니다. 또는 단순히 [닫기] 버튼을 클릭하면 [취소]와 같은 의미이므로 테이블 정의를 저장 한 후에도 외래 키가 계속 만들어집니다.

따라서 나에게 그러한 외래 키는 의미가 없으며 제거 할 수 있습니다.


FK를 만들고 싶었을 때 다른 테이블이 아직 PK를 설정하지 않았다는 것을 알고 프로세스를 취소하고 다른 테이블로 이동 한 다음 어떤 이유로 든 FK 프로세스를 계속하는 것을 잊었을 수 있습니다. 재귀 FK가 있습니다.
Andrew

4

아마도 디자이너는 TRUNCATE TABLE?

TRUNCATE TABLE 외래 키 제약 조건이있는 테이블에서는 사용할 수 없습니다 자체 참조 외래 키 가있는 경우 사용할 있지만 다른 테이블에 . TRUNCATE TABLE (Transact-SQL) 설명서에서 다음을 수행하십시오 .

BOL 추출물

DELETE없이 문 WHERE절은 유사한 효과가있다 TRUNCATE TABLE(표에서 모든 행을 제거하는)하지만 DELETE문이 허용하는 이유가 될 수 삭제 트리거, 화재 DELETE하지만를 TRUNCATE TABLE.

권한을 사용 하여이 작업을 수행하고 ( DELETE삭제 권한이 TRUNCATE TABLE필요하고 테이블 변경 권한이 필요함) 디자이너가 이것을 할 수없는 이유가 있습니까?

참고 : 디자이너가 수행 한 작업으로 실제로 사용을 비활성화하지는 않지만 TRUNCATE TABLE여전히 이것이 의도 된 것으로 추측하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.