如果外键不存在然后添加外键约束(或删除外键约束,如果存在)而不使用名称?

use*_*567 10 sql sql-server-2008

我发现创建查询有困难.假设我有一个产品和品牌表.我可以使用这个命令添加一个外键,

          ALTER TABLE Products
          ADD FOREIGN KEY (BrandID)
          REFERENCES Brands(ID)
Run Code Online (Sandbox Code Playgroud)

但是,如果Foreign Key不存在,我只需要运行此命令.我需要的类似的事情是删除外键约束如果存在而不使用名称.

Joh*_*hnD 18

试试这个:

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
Run Code Online (Sandbox Code Playgroud)


Nen*_*vic 12

首先,你应该总是命名你的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)
Run Code Online (Sandbox Code Playgroud)


小智 9

你也可以使用它.

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])
Run Code Online (Sandbox Code Playgroud)


Scu*_*eve 5

要在不知道约束名称且没有内部联接的情况下执行此操作,可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

如果愿意,可以从该表中获取约束的名称,然后进行拖放。