2

我有以下 T-SQL 架构。我遇到的问题是Download表上的检查约束不起作用。我仍然能够将包含和NULL的值的记录插入到该表中。为什么会这样?ProductIdCategoryId

我希望ProductIdCategoryId列都允许NULL值,但是对于任何给定的记录,只允许将其中一个设置为NULL,另一个需要是CategoryorProduct表的相应 ID。

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 回答