2010-02-08 4 views
1

도구 : SQL2000/5/8 .NET 3.5, C#을레거시 데이터베이스와 외래 키 문제를 해결

나는 두 개의 테이블이있는 응용 프로그램을 가로 질러왔다. "코드"의 표는 다음과 같다 :

TABLE1 (1 - N) TABLE2

그래서 표 (T1)는 ID를 가지고 : IdT1 및 표 2 (T2)의 해당 ID (IdT2)가 외래 키 t2.IdT1

이 1.N 관계는 어느 정도 적용되는 코드입니다. DB에 FK가 전혀 없었습니다. (이것을 고안 한 사람은 제약 조건이나 그와 유사한 것은 추가하지 않았다.)

문제 I는 TABLE1, 에 참조 된 행을 저장하는 애플리케이션 (정확하게) 미국 TABLE2에 IdT1를 사용하는 것으로했지만도 (0) 특별한 경우 제로 사용된다.

그래서 나는 (표 2)이 라인을 따라 뭔가가 있습니다

IDt2 IdT1 OtherFields 
1 1 x 
2 1 x 
3 5 x 
4 0 x 
5 3 x 
6 0 x 
… 

당신이 TABLE1에 inexistent 행에 행 4, 6 개 FK 점에서 볼 수 있듯이. 이 소프트웨어는 IF 문장이나 이와 유사하게 "추적"하는 곳이 많기 때문에 효과가 있습니다. 지금은 정말 좋은 생각이 아니라고 변경 (그 코드를 만지고 싶지 않을 것이다 "작품과 내가 작성하지 않은"지금)이 유일한 방법하지 않는 한,. (우리가 템플릿 코드로 자동으로 생성하고있는 FKS이없는 경우, 어떤 일이 생성되지 않습니다)

는 지금은 응용 프로그램의 다른 부분을 수정하고 있는데 나는 FKS을 가지고에게 데이터베이스를 필요로 .

가 위의 시나리오 감안할 때, 나는 "지금까지"제약 조건을 확인하지 않는 FK를 만들 수있는 방법은 무엇입니까? 이 (앱이 FK에서 아이디 = 0이 일에 5 년 이상 근무 것을 고려)는 "문제"가 될 것인가? 의견 있으십니까? Tks.

답변

2

로 간주되지 않습니다 점에 유의, 외래 키 제약의 유일한 목적은 외래 키가 기본 키 테이블에 존재하는지 확인하는 것입니다. 당신이 그것을하고 싶지 않다면, 왜 당신은 그것을 왜 그 곳에서 원하니?

한 가지 해결책은 PK가 0 인 기본 키 테이블에 Magic Row를 추가 한 다음 FK 제약 조건을 추가하는 것입니다. 이것은 순수한 접근 방식에서 권장되는 해결책이 아니다,하지만 당신은, 당신의 질문에 지정하는 최고의 솔루션이 될 수있는 제약 조건을 부여.

+0

통찰력에 감사드립니다. 나는 (당신이 말한대로 그 목적이 패배 때문에)에 FK를 제거하고 코드로 작업하기로 결정했습니다. 마법의 행렬이 유혹에 빠졌지 만 나는 마법의 길을 택하지 않았다.) –

1

FK를 만들려고하고 existing 데이터를 확인하지 않으려면 WITH NOCHECK ...을 사용할 수 있지만이 경우에는 FK의 모든 목적을 무시할 수 있습니다. 또한 NOCHECK로 정의 된 제약은 일반적으로 쿼리 최적화

+0

고맙습니다. SQLMenace, 안타깝게도 NOCHECK가 있습니다. ** 정확한 ** 지적 ** ** 기존 ** 데이터 만 확인하십시오. 나는 데이터가 실제로 그것에 대한 정의를하지 않는다고 가정 할 때 FK를 제거하기로 결정했다. –