簡體   English   中英

引用外鍵並為父表中的列添加檢查約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM