2012-03-14 1 views
0

거대한 데이터베이스 (SQL Server)를 청소하고 있으며 업데이트 구문이 PK 테이블을 위반하는 경우 행을 삭제할 수 있는지 알고 싶습니다.스크립트를 종료하지 않고 sql 스크립트에서 기본 키 위반을 처리하려면 어떻게해야합니까?

나는 이런 식으로 뭔가 싶어 :

UPDATE EMODCONCT SET CODPERLET = '2003' WHERE CODPERLET = '2003BI' 
IF "UPDATE VIOLATES PK OF EMODCONCT" THEN 
DELETE FROM EMODCONCT WHERE CODPERLET = '2003BI' 
END 
<DON'T SHOW ANY ERROR AND CONTINUE THE EXECUTION OF THE SCRIPT> 

이런 종류의 오류 및 오류에 의해 중단없이 실행을 계속 명령을 감지 할 수있는 플래그가 거기를?

감사합니다.

+0

테이블간에 PK/FK 관계를 올바르게 설정했다면 pkData가 기본 테이블에서 사용 가능하지 않으면 업데이트 할 수 없습니다. – Kaf

+3

그래서 .... PK의 값을 변경하고 새로운 값이 실제로 중복되면 결과를 제거한 다음 계속 하시겠습니까? 처음에 복제 할 모든 값을 먼저 삭제하지 않으시겠습니까? – Lamak

답변

1

오류가 발생하지 않는 방식으로 표에 값이 먼저 포함되어 있는지 확인하지 않으시겠습니까? 내가 :)을 변경합니다

이의이 Orders 테이블의 기본 키가 (product_name, customer_name)의 화합물이다 가정 해 봅시다 그래서

IF EXISTS(SELECT NULL FROM EMODCONCT WHERE CODPERLET = @newId) 
BEGIN 
    DELETE FROM EMODCONCT WHERE CODPERLET = @oldId 
END 
ELSE 
BEGIN 
    UPDATE EMODCONCT 
     SET CODPERLET = @newId 
    WHERE CODPERLET = @oldId 
END 
+0

왜냐하면 36 개의 테이블처럼 모든 테이블이 서로 다른 기본 키 조합을 가지고 있습니다. "CODPERLET"만이 그 안에 일반적인 PK입니다. 이 경우 모든 테이블에 대해 diff 검증을 수행해야하며 빠른 솔루션을 찾고있었습니다. 어쨌든 고마워! – Sawd

+0

이것은 거의 정확하게 예제에서 작성하고자하는 코드입니다. 차이점은 오류가 발생할 때까지 기다리고 나서 처리하는 것입니다. 오류가 발생하기 전에 오류가 발생하는 상황을 감지하고 정확히 동일한 방식으로 처리합니다. try catch를 사용하여이 문제를 해결하는 코드를 더 작성할 수 있습니다. – cadrell0

+0

캐치를 시도하십시오! 내가 어떻게 이것을 잊어 버린거야? 나는 T-SQL에서 그것을 사용한 적이 없지만 한번 사용해 볼 것입니다. 감사. – Sawd

1

데이터 요소 이름 및 샘플 데이터 나에게 익숙하지 않은. 행은 다음과 같은 제안에 대해이 있습니다

Colm orders freezer 
Pete orders toaster 
Ravi orders freezer 
Ravi orders toaster 

요구 사항 : 업데이트는 토스터에 대한 주문을 냉동고에 대한 모든 주문을 변경할 수 있지만이 발생하는 경우 PK 위반이 그 위반 행을 삭제합니다. 따라서

Colm orders freezer -> (row is altered to) Colm ordered toaster 
Pete orders toaster -> (row is unaffected) Pete ordered toaster 
Ravi orders freezer -> (row is deleted) 
Ravi orders toaster -> (row is deleted) 

: 고객이 모두 냉장고 토스터에 대한 주문이 곳

  1. 행을 제거합니다.
  2. 고객이 냉동고 주문으로 토스터를 주문한 행을 변경합니다.

p.s. 이것은 상당히 비정상적인 종류의 업데이트처럼 들리므로 설계자와 사양을 다시 확인하여 의도가 확실한 지 확인하십시오.

+1

누군가 downvote를 설명 할 수 있을까요? 필자는 (유추 한 바와 같이) 유추를 사용하고 있지만 분명히 내 분석이 잘못되어있는 것입니까? – onedaywhen

2

TRY CATCH 블록 사용 방법은 어떻습니까?

BEGIN TRY 
    UPDATE EMODCONCT SET CODPERLET = '2003' WHERE CODPERLET = '2003BI' 
END TRY 
BEGIN CATCH 
    IF ERROR_NUMBER() = 2627 -- Violates Primary Key 
    DELETE FROM EMODCONCT WHERE CODPERLET = '2003BI' 
END CATCH 
관련 문제