2011-07-04 31 views
2

我有以下T-SQL架構。我遇到的問題是Download表上的檢查限制不起作用。我仍然可以在該表中插入包含ProductIdCategoryIdNULL值的記錄。這是爲什麼?T-SQL:CHECK約束不起作用

我想ProductIdCategoryId列都允許NULL值,但對於任何給定的記錄只有其中一個被允許設置爲NULL,其他需要在CategoryProduct表的相應標識。

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小馬 – Chris

+0

看着我的約束,我不認爲這是完全正確的,因爲現在它每次我嘗試插入時都會觸發。什麼是寫這個來完成我所需要的正確方法。 – Chris

+0

@payntbrush:查看更新 - 將「AND」更改爲「OR」以允許其中一個爲空,但不能同時爲兩個。 –