답변:
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;
중간 기간을 제외하고 두 제약 조건이 모두 존재하는 경우 삽입이 두 인덱스 모두에 대해 검증됩니다.
동일한 외래 키 제약 조건, 즉 동일한 열에 있고 동일한 테이블 및 열을 참조하는 데 사용하지 않습니다.
같은 검사를 2 번 이상하는 것과 같습니다.
청록색의 것 같습니다.
파란색에서 녹색으로 컷 오버를 시작하면 일시적으로 여분의 사본을 만들어야합니다.
우리가하고 싶은 것은 일시적으로 여분의 외래 키를 CHECK WITH NOCHECK
만들고 ON UPDATE CASCADE ON DELETE SET NULL
; 이것이하는 것은 작동하는 외래 키이지만 키를 만들 때 기존 행을 확인하지 않습니다.
나중에 일치해야하는 모든 행을 정리 한 후 명령 옵션없이 새 외래 키를 만들고 (기본값은 CHECK WITH CHECK
일반적으로 원하는 것임 ) 임시 외래 키를 삭제합니다.
외래 키를 삭제하고 다시 만든 경우 일부 가비지 행이 미끄러질 수 있습니다.