2013-12-19 3 views
0

SQL Server Management Studio에서 데이터베이스로 작업하고 있는데 두 개의 테이블 인 Route and Tractor가 있습니다 (단순화 된 예입니다). 현재 Route 테이블에는 TractorID라는 열이 있습니다. 트랙터 테이블의 ID 열의 외래 키 또는 인덱스는 아니지만 애플리케이션에서 ID로 트랙터 테이블을 검색하는 데 사용됩니다. 이를 통해 사용자는 트랙터가 사용 된 경로에 영향을주지 않고 과거에 트랙터를 삭제할 수있었습니다.이미 데이터가있을 때 열을 외래 키로 업그레이드

TractorID 열이 트랙터 테이블의 ID 열에 대한 외래 키이므로 문제가 발생했습니다. 이제 데이터베이스를 업그레이드합니다. 사용자가 트랙터를 삭제했지만 경로 테이블에서 업데이트되지 않았으므로 트랙터 테이블에 더 이상 존재하지 않는 TractorID가있는 몇 가지 경로가 있습니다. 컬럼을 외래 키로 업그레이드 할 수 있도록 이러한 잘못된 ID를 미리 null로 설정해야합니다.

는 그래서 아래 문을 사용하여 수행했습니다

UPDATE Route SET Route.TractorID = NULL 
WHERE Route.TractorID IS NOT NULL AND NOT EXISTS(SELECT * FROM Tractor 
WHERE Tractor.ID = Route.TractorID) 

지금까지,이 사항이 트릭을 할 것 같다,하지만 난 그것이 얼마나 효율적으로 걱정입니다. Google은 한 달에 250 만 개 정도의 경로를 포함하는 몇 가지 데이터베이스를 업그레이드해야합니다. 나는이 서브 쿼리가 각 행에 대해 트리거한다고 생각한다. 따라서 경로와 트랙터 테이블을 함께 결합 ( JOIN Tractor ON Route.TractorID = Tractor.ID)하고 그 행의 조인이 실패한 경우 TractorIDNULL으로 설정하는 해결책을 찾고자한다. TractorID은 (는) Tractor.ID과 일치하지 않습니다.

이것이 가능할까요? 아니면 현재의 솔루션으로 충분합니까? 미리 감사드립니다.

답변

1

첫 번째 단계는 경로 테이블의 TractorID 열에 색인이 있는지 확인하십시오. 당신이 모든 고아 TractorID의를 찾기 위해 왼쪽 외부 조인을 사용하고

UPDATE Route 
SET TractorID = NULL 
FROM Route AS R 
LEFT OUTER JOIN Tractor AS T 
ON R.TractorID = T.ID 
WHERE T.ID IS NULL 

왼쪽 가입 null로 설정할 수 있습니다 업데이트하는해야 더 빨리 NOT이 존재하는 것보다 들어

CREATE NONCLUSTERED INDEX IX_Route_TracorID ON Route(TractorID) 

.

+0

굉장! 이것이 제가 찾고 있던 것입니다. 가능한 모든 조인에서 자신을 새로 고쳐야합니다 ... – Otteravenger

0

데이터를 간단히 정리하는 것이 가장 좋은 해결책은 업데이트 문이 정상입니다.

관련 문제