2013-09-01 1 views
1

CHECK 제약 조건을 추가하려고합니다.제약 조건을 추가 할 때 WITH CHECK 절이 확실하지 않습니다.

내가 먼저 할

메시지

메시지 547, 수준 16, 상태 0 실패

ALTER TABLE [Production].[Products] WITH CHECK 
ADD CONSTRAINT [CHK_Products_unitprice] CHECK (([unitprice]>=(0))) 
GO 

, 줄 1
점검 제한 조건과 충돌 ALTER TABLE 문 "CHK_Products_unitprice" . 충돌은 "TSQL2012"데이터베이스, "Production.Products"테이블, "unitprice"열에서 발생했습니다.

그런 다음 "WITH CHECK"옵션을 사용하지 않고 제약 조건을 추가하면 위와 같은 오류가 발생합니다.

그렇다면 "체크"옵션의 요지는 무엇입니까?

+2

충돌이 있습니다. 즉, 순수하고 단순한 제약 조건을 충족하지 않는 값입니다. 나는 유효한 질문을 보지 못합니다. –

+0

죄송합니다. "With check"옵션을 사용하는 목적은 기존 행이 유효하지 않은 경우 오류를 발생시키는 것이 었습니다. 그렇지 않으면 제약 조건을 허용하고 후속 삽입에만 적용합니다 – TheWommies

+1

아니요, 비활성화 된 제약 조건을 다시 활성화 할 때 강제로 다시 검사합니다. –

답변

3

새로운 점검 제한 조건을를 만들기위한 기본 읽고 ALTER 충돌이 발견되면 실패, 기존 값을 평가합니다 WITH CHECK 옵션입니다. 당신이 점검 제한 조건 기존의 잘못된 값을 기존 무시를 배포해야하고 이전에 비활성화 제약을 사용할 때 기본 인 단점 (아래 참조), 이해하는 경우

당신은 WITH NOCHECK 옵션을 사용할 수 있습니다. | CHECK를

:

은 자세한 내용은 ALTER TABLE reference를 참조하십시오 WITH NOCHECK

표의 데이터가 에 대해 새로 추가되었거나 다시 활성화 된 FOREIGN KEY 또는 CHECK 제약 조건에 대해 유효성을 검사하는지 여부를 지정합니다. 이 지정되지 않은 경우, 새 제한 조건에 대해 WITH CHECK가 가정되고 다시 사용 가능한 제한 조건에 대해 WITH NOCHECK 이 가정됩니다.

새 CHECK 또는 FOREIGN KEY 제약 조건을 기존 데이터와 비교하지 않으려면 WITH NOCHECK를 사용하십시오. 드문 경우를 제외하고 작업을 수행하지 않는 것이 좋습니다. 새로운 제약 조건은 나중에 모든 데이터 업데이트 인 에서 평가됩니다. 제한이 추가 될 때 WITH UPCHECK에 의해 억제 된 모든 제한 조건 위반은 제약 조건을 준수하지 않는 데이터로 행을 업데이트하면 향후 업데이트가 발생할 수 있습니다 ( ).

쿼리 최적화 프로그램은 WITH NOCHECK로 정의 된 제약 조건을 고려하지 않습니다. 이러한 제약 조건은 ALTER TABLE 테이블 WITH CHECK CHECK CONSTRAINT ALL을 사용하여 을 다시 활성화 할 때까지 무시됩니다.

관련 문제