2011-07-04 12 views
2

次のT-SQLスキーマがあります。私が抱えている問題は、Downloadテーブルのチェック制約が機能していないということです。私はまだProductIdCategoryIdの両方の値がNULLのレコードをそのテーブルに挿入できます。なぜこれはそうですか?T-SQL:CHECK制約が機能しない

は、私は両方ProductIdCategoryId列がNULL値を許可するが、これらの任意のレコードの一つだけがCategoryまたはProductテーブルの対応するIDであることを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:updateを参照してください。どちらか一方がnullになることを許可するには、 'AND'を' OR'に変更します。 –