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.