2
我有以下T-SQL架構。我遇到的問題是Download
表上的檢查限制不起作用。我仍然可以在該表中插入包含ProductId
和CategoryId
的NULL
值的記錄。這是爲什麼?T-SQL:CHECK約束不起作用
我想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
甜蜜感謝OMG小馬 – Chris
看着我的約束,我不認爲這是完全正確的,因爲現在它每次我嘗試插入時都會觸發。什麼是寫這個來完成我所需要的正確方法。 – Chris
@payntbrush:查看更新 - 將「AND」更改爲「OR」以允許其中一個爲空,但不能同時爲兩個。 –