SQL Server의 동일한 열에서 여러 외래 키 사용


10

SQL Server를 사용하면 열에 여러 외래 키를 만들 수 있으며 다른 이름 만 사용하면 매번 동일한 개체를 참조하는 다른 키를 만들 수 있습니다. 기본적으로 모든 키는 동일한 관계를 정의합니다. 동일한 열에 정의되고 다른 테이블의 동일한 열에 대한 여러 외래 키를 사용하는 것이 무엇인지 알고 싶습니다. SQL Server를 통해 이와 같은 작업을 수행 할 수있는 이점은 무엇입니까?

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

답변:


12

이름 만 다른 중복 제약 조건이 있으면 이점이 없습니다. 마찬가지로 이름 만 다른 중복 인덱스가 있으면 이점이 없습니다. 둘 다 가치없는 오버 헤드를 추가합니다.

SQL Server 데이터베이스 엔진은 그렇게하지 않습니다. 적절한 제약 조건 명명 제약 조건 명명 규칙 (예 : FK_ReferencingTable_ReferencedTable)은 이러한 실수로부터 보호합니다.


17

SQL Server를 사용하면 많은 바보 같은 일을 할 수 있습니다.

모든 행이 자체 제약 조건을 충족하므로이를 위반 할 수는 없지만 열 자체를 참조 하는 외래 키를 만들 수도 있습니다 .

동일한 관계에서 두 개의 외래 키를 만드는 기능이 잠재적으로 유용한 한 가지 경우는 외래 키의 유효성 검사에 사용되는 인덱스가 생성시 결정되기 때문입니다. 더 나은 (즉, 더 좁은) 인덱스가 나중에 나올 경우, 더 나은 인덱스에 대해 새로운 외래 키 제약 조건이 만들어지고 활성 제약 조건이없는 간격없이 원래 제약 조건이 삭제됩니다.

(아래 예와 같이)

CREATE TABLE T1(
    T1_Id INT PRIMARY KEY CLUSTERED  NOT NULL,
    Filler CHAR(4000) NULL,
) 

INSERT INTO T1 VALUES (1, '');

CREATE TABLE T2(
    T2_Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    T1_Id INT NOT NULL CONSTRAINT FK REFERENCES T1 (T1_Id), 
    Filler CHAR(4000) NULL,
)


ALTER TABLE T1 ADD CONSTRAINT
    UQ_T1 UNIQUE NONCLUSTERED(T1_Id) 


/*Execution Plan uses clustered index*/ 
INSERT INTO T2 VALUES (1,1) 

ALTER TABLE T2  WITH CHECK ADD  CONSTRAINT FK2 FOREIGN KEY(T1_Id)
REFERENCES T1 (T1_Id)    

ALTER TABLE T2 DROP CONSTRAINT FK

/*Now Execution Plan now uses non clustered index*/    
INSERT INTO T2 VALUES (1,1)    

DROP TABLE  T2, T1;

중간 기간을 제외하고 두 제약 조건이 모두 존재하는 경우 삽입이 두 인덱스 모두에 대해 검증됩니다.


동일한 틈이없는 제약 조건 업데이트를 보장하기 위해 트랜잭션을 사용할 수 있습니까? 잠금이 적어 트랜잭션이 아닌 방법이 더 좋을까요?
binki

13

동일한 외래 키 제약 조건, 즉 동일한 열에 있고 동일한 테이블 및 열을 참조하는 데 사용하지 않습니다.

같은 검사를 2 번 이상하는 것과 같습니다.


-동의하지 않아. 기본 테이블에 두 개의 별도 검사가 필요할 수 있습니다. 예를 들어, 송신자와 수신자 아래 참조는 완전히 다르다 - stackoverflow.com/questions/40400483/...
TREX

@trex 당신은 다소 다른 것에 대해 이야기하고 있습니다. 여기서 질문은 "나는 같은 열에 정의 되고 다른 테이블의 같은 열에 대해 여러 개의 외래 키를 사용하는 것이 무엇인지 알고 싶습니다 ."
ypercubeᵀᴹ

@ ypercubeᵀᴹ-알았습니다. 분명히 만들기위한 감사합니다
TREX

6

같은 열에 50 개의 인덱스를 생성하고, 두 번째 로그 파일을 추가하고, 최대 서버 메모리를 20MB로 설정하는 것과 같은 이유입니다. 엔진에서 오버 헤드를 생성하여 조언이 부족한 것들에 대한 점검을 추가 할 수 있습니다.


2

청록색의 것 같습니다.

파란색에서 녹색으로 컷 오버를 시작하면 일시적으로 여분의 사본을 만들어야합니다.

우리가하고 싶은 것은 일시적으로 여분의 외래 키를 CHECK WITH NOCHECK만들고 ON UPDATE CASCADE ON DELETE SET NULL; 이것이하는 것은 작동하는 외래 키이지만 키를 만들 때 기존 행을 확인하지 않습니다.

나중에 일치해야하는 모든 행을 정리 한 후 명령 옵션없이 새 외래 키를 만들고 (기본값은 CHECK WITH CHECK일반적으로 원하는 것임 ) 임시 외래 키를 삭제합니다.

외래 키를 삭제하고 다시 만든 경우 일부 가비지 행이 미끄러질 수 있습니다.

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