2

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

と列の両方で値を許可しProductIdたいのですが、特定のレコードでは、これらの1つだけをに設定でき、もう1つはまたはテーブルの対応するIDである必要があります。CategoryIdNULLNULLCategoryProduct

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
4

1 に答える 1

7

使用する:

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

NULL値ではありません-値がないためのプレースホルダーです。そのため、特定の構文を使用してチェックする必要があります。

于 2011-07-04T03:59:12.087 に答える