2011-07-04 3 views
2

다음 T-SQL 스키마가 있습니다. 내가 겪고있는 문제는 Download 테이블의 검사 제약 조건이 작동하지 않는다는 것입니다. 나는 여전히 ProductIdCategoryId 모두에 대해 NULL 값을 포함하는 레코드를 해당 테이블에 삽입 할 수 있습니다. 이게 왜 그렇게?T-SQL : CHECK 제약 조건이 작동하지 않습니다.

나는 모두 ProductIdCategoryIdNULL 값을 허용하고 싶지만, 이들의 주어진 레코드에 대해 하나는 Category 또는 Product 테이블의 해당 아이디로 NULL에, 다른 요구 사항을 설정할 수 있습니다.

CREATE TABLE Category (
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Description nvarchar(100) NULL, 
    ParentCategoryId int NULL 
    CONSTRAINT fk_CategoryId_CategoryId FOREIGN KEY (Id) REFERENCES Category(Id) 
) 
GO 

CREATE TABLE Product (
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Title nvarchar(100) NOT NULL, 
    TagLine nvarchar(MAX) NOT NULL, 
    Description nvarchar(MAX)NULL, 
    CategoryId int NOT NULL, 
    ImageUrl nvarchar(255) NULL, 
    Keywords nvarchar(200) NOT NULL 

    CONSTRAINT fk_ProductCategoryId_CategoryId FOREIGN KEY (CategoryId) REFERENCES Category(Id) 
) 
GO 

CREATE TABLE Download (
    Id int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Title nvarchar(100) NOT NULL, 
    Description nvarchar(MAX) NULL, 
    CategoryId int NULL, 
    ProductId int NULL, 
    DownloadUrl nvarchar(255) NOT NULL, 

    CONSTRAINT fk_DownloadCategoryId FOREIGN KEY (CategoryId) REFERENCES Category(Id), 
    CONSTRAINT fk_DownloadProductId FOREIGN KEY (ProductId) REFERENCES Product(Id), 
    CONSTRAINT chk_ReferencesCategoryOrProduct CHECK (ProductID != NULL AND CategoryId != NULL) 
) 
GO 

답변

7

사용 :

CONSTRAINT chk_ReferencesCategoryOrProduct CHECK (ProductID IS NOT NULL 
               OR CategoryId IS NOT NULL) 

NULL는 값이 아닙니다 - 그것은 값의 부족에 대한 자리 표시 자입니다. 그래서 특정 구문을 사용하여 확인해야합니다.

+0

감사합니다. OMG Ponies – Chris

+0

내 제약 조건을 살펴보면 삽입 할 때마다 즉시 실행되는 것처럼 생각하지 않습니다. 필요한 것을 성취하기 위해 이것을 쓰는 올바른 방법은 무엇입니까? – Chris

+0

@payntbrush : 업데이트보기 - 둘 중 하나만 null이되도록 허용하려면 'AND'를 'OR'로 변경하십시오. –

관련 문제