2009-04-10 4 views
0

나는 SQL 2005 MS의 테이블을 가지고 할 싶습니다업데이트 쿼리 실행 순서를 제어하는 ​​방법?

update Table 
set ID = ID + 1 
where ID > 5 

을 그리고 문제는 ID가 기본 키는 것을 내가 이렇게하면이 쿼리 행에 관해서 때문에 오류가 ID가 8 인 경우 값을 9로 변경하려고하지만 값 9가있는이 테이블에 이전 행이 있으며 제약 조건 위반이 있습니다.

따라서 업데이트 쿼리가 내림차순으로 실행되도록 제어하고 싶습니다.

ID = 1,2,3,4 등은 아니지만 ID = 98574 (또는 그 밖의 경우), 98573, 98572 등등입니다. 이 상황에서는 제약 조건 위반이 발생하지 않습니다.

업데이트 실행 순서를 제어하는 ​​방법은 무엇입니까? 이 방법을 프로그래밍 방식으로 구현하는 간단한 방법이 있습니까?

답변

2

Transact SQL은 명령문이 완료 될 때까지 제약 조건 검사를 연기합니다.

UPDATE mytable 
SET  id = CASE WHEN id = 7 THEN 8 ELSE 7 END 
WHERE id IN (7, 8) 

이 실패하지 않습니다이 id78 스왑하지만,이 쿼리는 이유

.

쿼리가 완료된 후 일부 중복 값이 ​​남아있는 것 같습니다.

+0

네 말이 맞아. 내 실수! –

1

이 시도 :

update Table 
set ID = ID * 100000 + 1 
where ID > 5 

update Table 
set ID = ID/100000 
where ID > 500000 
+0

두 번째 업데이트에서 +1해야한다고 생각합니다. – ybo

0

괄호 ...

업데이트 표를 잊지 마세요 세트 ID = (ID * 100000) + 1 ID> 5

하는 경우 ID가 너무 커지면 항상 루프를 사용할 수 있습니다.

0

개인적으로 나는이 방법으로 id 필드를 업데이트하지 않을 것이므로 이전 테이블을 새로운 테이블로 만들 것입니다. 두 ID를 모두 저장하면 모든 업데이트가 해당 ID에서 수행됩니다. 캐스케이드 삭제 (우발적으로 오랫동안 테이블을 잠글 수 있음)를 사용하지 않는 경우, 하위 테이블로 시작하여 pk 테이블로 시작하는 것이 현명합니다. 단일 사용자 모드에 있거나 테이블이 서로 일치하지 않는 동안 다른 사용자가 사물을 변경하는 경우 불쾌한 데이터 무결성 문제가 발생할 수있는 경우가 아니라면이 작업을 수행하지 마십시오.

PK는 바꿔서 바보짓을하는 것이 아니며 가능한 경우 변경해서는 안됩니다.

이러한 방식으로 프로덕션 데이터를 변경하기 전에 전체 백업을 수행해야합니다. 이 일을 망쳐 놓으면 회복 할 수 없으면 일자리가 손실 될 수 있습니다.

관련 문제