簡體   English   中英

如果外鍵不存在則添加外鍵約束(或如果存在則刪除外鍵約束)而不使用名稱?

[英]If Foreign Key Not Exist Then Add Foreign Key Constraint(Or Drop a Foreign Key Constraint If Exist) without using Name?

我發現創建查詢有困難。 假設我有一個產品和品牌表。 我可以使用此命令添加外鍵,

          ALTER TABLE Products
          ADD FOREIGN KEY (BrandID)
          REFERENCES Brands(ID)

但是如果外鍵不存在,我只需要運行這個命令。 我需要的類似的事情是在不使用名稱的情況下刪除外鍵約束如果存在。

試試這個:

IF NOT EXISTS (SELECT * FROM sys.objects o WHERE o.object_id = object_id(N'[dbo].[FK_Products_Brands]') AND OBJECTPROPERTY(o.object_id, N'IsForeignKey') = 1)
BEGIN
    ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_Products_Brands] FOREIGN KEY([BrandID]) REFERENCES [dbo].[Brands] ([Id])
END

首先,你應該總是命名你的FK和所有其他約束,以便像這樣省去自己的麻煩。

但是,如果您不知道FK的名稱,可以使用多個系統視圖進行檢查:

IF NOT EXISTS 
(
    SELECT * FROM sys.foreign_key_columns fk 
    INNER JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id 
    INNER JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
    WHERE fk.parent_object_id = object_id('Products') AND pc.name = 'BrandID'
    AND fk.referenced_object_id = object_id('Brands') AND rc.NAME = 'ID'
)
ALTER TABLE Products 
ADD CONSTRAINT Your_New_FK_NAME FOREIGN KEY (BrandID)
REFERENCES Brands(ID)

你也可以使用它。

IF(OBJECT_ID('FK_Products_Brands', 'F') IS NULL)
ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_Products_Brands] FOREIGN KEY([BrandID]) REFERENCES [dbo].[Brands] ([Id])

要在不知道約束名稱且沒有內部聯接的情況下執行此操作,您可以執行以下操作:

IF NOT EXISTS(SELECT NULL FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE [TABLE_NAME] = 'Products' AND [COLUMN_NAME] = 'BrandID')
BEGIN
    ALTER TABLE Products
    ADD FOREIGN KEY (BrandID)
    REFERENCES Brands(ID)
END

如果您願意,可以從此表中獲取約束的名稱,然后執行刪除/添加。

這在 Azure sql 服務器中對我來說很順利。

IF NOT EXISTS (
    SELECT NULL 
    FROM information_schema.TABLE_CONSTRAINTS
WHERE
    CONSTRAINT_SCHEMA = 'dbo' AND
    CONSTRAINT_NAME   = 'FK_company_id' AND
    CONSTRAINT_TYPE   = 'FOREIGN KEY'
) ALTER TABLE dbo.table_main
ADD CONSTRAINT FK_company_id
FOREIGN KEY (company_id)
REFERENCES dbo.table_company(id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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