T-SQL: ограничение CHECK не работает - PullRequest
2 голосов
/ 04 июля 2011

У меня есть следующая схема T-SQL.У меня проблема в том, что проверочное ограничение на таблицу Download не работает.Я все еще могу вставить записи в эту таблицу, которые содержат NULL значения для ProductId и CategoryId.Почему это так?

Я хочу, чтобы оба столбца ProductId и CategoryId допускали значения NULL, но для любой данной записи только один из них может быть установлен на NULL,прочее должно быть соответствующим идентификатором таблицы Category или Product.

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

1 Ответ

7 голосов
/ 04 июля 2011

Использование:

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

NULL - не значение, а заполнитель для отсутствия значения. Вот почему вам нужно использовать определенный синтаксис, чтобы проверить это.

...