[英]Is it not possible to have a check constraint reference a column that also has a foreign key?
[英]Reference a foreign key and Add check constraint for column in parent table
如何向表BusinessCategories
添加檢查列IsBusinessCategory
值是否為相關Categories.ID
“true”?
CREATE TABLE [dbo].[Categories](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ParentID] [int] NULL,
[DisplayNameHe] [nvarchar](400) NOT NULL,
[DisplayNameEn] [nvarchar](400) NOT NULL,
[DisplayNameEs] [nvarchar](400) NOT NULL,
[CreateDate] [datetime] NOT NULL,
[Status] [bit] NOT NULL,
[IsBusinessCategory] [bit] NULL
)
CREATE TABLE [dbo].[BusinessCategories](
[ID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[BusinessCategoryID] [INT] NOT NULL REFERENCES Categories(ID) -- Need to check that is
businessCategory ==1
[BusinessID] [INT] NOT NULL REFERENCES Business(ID)
)
目標是能夠僅將具有IsBusinessCategory == true 的Categories表中的值插入到列BusinessCategoryID 中。
我不推薦那種解決方案,應該在應用程序的業務層完成
在 SQL 方面有一個棘手的方法,不是最佳的,但可行的......
首先創建一個標量函數,返回所選類別的 isBusinessCategory 值
CREATE FUNCTION fn_isBusinessCategory (@CatID INT) RETURNS INT
AS
BEGIN
RETURN (SELECT isBusinessCategory FROM Categories WHERE CategoryID = @CatID)
END
GO
創建另一個標量函數,如果在 BusinessCategories 中引用給定類別,則該函數返回 1
CREATE FUNCTION fn_isBusinessCategoryValid (@CatID INT, @isBusinessCat BIT) RETURNS BIT
AS
BEGIN
IF @isBusinessCat = 1
RETURN 1
ELSE IF EXISTS (SELECT 1 FROM BusinessCategories WHERE CategoryID = @CatID)
RETURN 0
ELSE
RETURN 1
END
GO
添加以下約束
步驟 1 驗證兩個表之間完整性的外鍵
ALTER TABLE BusinessCategories ADD CONSTRAINT FK_BusinessCategory
FOREIGN KEY (CategoryID)
REFERENCES Categories (CategoryID)
步驟 2 檢查約束以驗證該類別 is_businessCategory
ALTER TABLE BusinessCategories ADD CONSTRAINT ck_BusinessCategory
CHECK (dbo.fn_isBusinessCategory(CategoryID) = 1)
步驟 3 檢查約束以防止使用時將類別更改為非業務類別
ALTER TABLE Categories ADD CONSTRAINT ck_Category_isBusinessCategory
CHECK (dbo.fn_isBusinessCategoryValid(CategoryID, isBusinessCategory) = 1)
目標是能夠僅將具有 IsBusinessCategory == true 的 Categories 表中的值插入到列 BusinessCategoryID。
您可以通過編寫一個將BusinessCategoryID
作為參數並查詢 Categories 表以獲取IsBusinessCategory
的值的 UDF 來實現這IsBusinessCategory
。 CHECK 約束將簡單地測試參數的返回值是真還是假。
但是請注意,只有在向BusinessCategories
表添加行時才會檢查此約束。 如果有人更改了Categories
表中IsBusinessCategory
的值,則 CHECK 約束將無法捕獲它。 您需要在Categories
表上放置一個單獨的約束來捕捉它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.