2010-08-09 5 views
18

나는 데이터 입력의 유효성을 검사하려고 같은 테이블에 여러 컬럼에 CHECK 제약 조건을 사용하는 SQL 서버 2008CHECK 제약 조건은

를 사용합니다.

나는 오류가 발생 :

Column CHECK constraint for column 'AAAA' references another column, table 'XXXX'.

점검 제한 조건이 방식으로 작동하지 않습니다.

FK를 사용하지 않고 단일 테이블에서 이것을 구현하는 다른 방법은 없습니까?

덕분에 여기

내 코드의 예

CREATE TABLE dbo.Test 
( 
EffectiveStartDate dateTime2(2)  NOT NULL, 
EffectiveEndDate dateTime2(2)  NOT NULL 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate), 
); 
+2

왜 "without FK"?? 외래 키는 두 가지 테이블을 연결하기 위해 ** 설계되었습니다 ** - 핵심 역량, 직업, 이유 - FK의 직업 일 때 FK를 사용하지 않는 이유는 무엇입니까 ??? –

+0

내 질문에 내 코드를 추가 했으니 이제는 더 이해하기 바란다. – GibboK

답변

40

예, 테이블 수준에서 CHECK 제약 조건을 정의는

CREATE TABLE foo (
    bar int NOT NULL, 
    fred varchar(50) NOT NULL, 

    CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish') 
) 

당신은 컬럼으로 인라인을 선언하는 제약

... 
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...) 
... 

편집보다 게시하기가 쉽습니다. 쉼표가 수정되었습니다. 물론

CREATE TABLE dbo.Test 
( 
    EffectiveStartDate dateTime2(2)  NOT NULL, 
    EffectiveEndDate dateTime2(2)  NOT NULL, --need comma 
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma 
); 

이 질문 남아 당신이 그것이 FK 제약 있어야 할 CHECK 제약 조건을 사용하는 ...?

+0

안녕하세요, 나는 당신의 코드와 그의 작업을 테스트했는데, 매우 비슷하기 때문에 원래의 질문에 게시했습니다.하지만 작동하지 않습니다. 어떤 아이디어? 당신의 시간을 내 주셔서 감사합니다 – GibboK

+0

+1 논리적으로 제약 조건은 행 수준에서 정의됩니다 논쟁 하겠지만. 테이블 수준 CHECK 제약 조건은 SQL Server가 직접 지원하지 않는 동일한 테이블의 다른 행에있는 데이터를 참조 할 수 있습니다. – onedaywhen

+0

@onedaywhen : CK 제약 조건은 항상 * 행 당 *입니다. "테이블 수준"은 테이블에 첨부 된 것으로 열에 첨부됩니다. – gbn

2

점검 제한 조건은 단일 열 또는 전체 레코드를 나타낼 수 있습니다.

사용 레코드 레벨 제한이 구문 :

ALTER TABLE MyTable 
ADD CONSTRAINT MyCheck 
CHECK (...your check expression...) 
1

당신은 단순히 테이블에 트리거에서 유효성 검사를 적용 할 수 있습니다, 특히 검사가 실패 할 경우 작업이 롤백됩니다 어느 쪽이든 그.

관련 문제