2
다음 T-SQL 스키마가 있습니다. 내가 겪고있는 문제는 Download
테이블의 검사 제약 조건이 작동하지 않는다는 것입니다. 나는 여전히 ProductId
및 CategoryId
모두에 대해 NULL
값을 포함하는 레코드를 해당 테이블에 삽입 할 수 있습니다. 이게 왜 그렇게?T-SQL : CHECK 제약 조건이 작동하지 않습니다.
나는 모두 ProductId
및 CategoryId
열 NULL
값을 허용하고 싶지만, 이들의 주어진 레코드에 대해 하나는 Category
또는 Product
테이블의 해당 아이디로 NULL
에, 다른 요구 사항을 설정할 수 있습니다.
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 Ponies – Chris
내 제약 조건을 살펴보면 삽입 할 때마다 즉시 실행되는 것처럼 생각하지 않습니다. 필요한 것을 성취하기 위해 이것을 쓰는 올바른 방법은 무엇입니까? – Chris
@payntbrush : 업데이트보기 - 둘 중 하나만 null이되도록 허용하려면 'AND'를 'OR'로 변경하십시오. –