2
次のT-SQLスキーマがあります。私が抱えている問題は、Download
テーブルのチェック制約が機能していないということです。私はまだProductId
とCategoryId
の両方の値がNULL
のレコードをそのテーブルに挿入できます。なぜこれはそうですか?T-SQL:CHECK制約が機能しない
は、私は両方ProductId
とCategoryId
列がNULL
値を許可するが、これらの任意のレコードの一つだけがCategory
またはProduct
テーブルの対応するIDであることを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:updateを参照してください。どちらか一方がnullになることを許可するには、 'AND'を' OR'に変更します。 –