Chr*_*ris 2 sql t-sql sql-server check-constraints
我有以下T-SQL架构.我遇到的问题是Download表上的检查约束不起作用.我仍然可以将记录插入到包含该表NULL的两个值ProductId和CategoryId.为什么会这样?
我希望两个ProductId和CategoryId列都允许NULL值,但对于任何给定的记录,只允许其中一个设置为NULL,另一个需要是Category或Product表的相应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
Run Code Online (Sandbox Code Playgroud)
使用:
CONSTRAINT chk_ReferencesCategoryOrProduct CHECK (ProductID IS NOT NULL
OR CategoryId IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
NULL不是一个价值 - 它是缺乏价值的占位符.这就是为什么您需要使用特定语法来检查它.
| 归档时间: |
|
| 查看次数: |
1777 次 |
| 最近记录: |