如何在SQL Server中使用级联删除?

Bic*_*yen 315 sql-server cascading-deletes

我有2个表:T1和T2,它们是带有数据的现有表.我们在T1和T2之间有一对多的关系.当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,T2中的所有关联记录也将被删除.

他们之间存在外来约束.我不想删除表或创建触发器来删除T2.例如,当我删除员工时,所有审核记录也应该消失.

T1 - 员工,

Employee ID      
Name
Status
Run Code Online (Sandbox Code Playgroud)

T2 - 性能评测,

Employee ID - 2009 Review
Employee ID - 2010 Review
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 351

你需要,

  • 删除现有的外键约束,
  • ON DELETE CASCADE启用设置的情况下添加新的.

就像是:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE
Run Code Online (Sandbox Code Playgroud)

  • 另一点支持软删除的硬删除 (5认同)
  • 我和我的团队就这样做了.我们不得不DROP我们的约束并重新添加它们.这对我们有用. (3认同)
  • 如何支持硬删除?软删除永远不会有约束问题。似乎与我相反。 (2认同)
  • @Maxx在硬删除中,您删除一条记录,而不必担心孤立的寄存器,而在软删除中,您需要手动进行。 (2认同)

Mik*_*ill 295

要将"级联删除"添加到SQL Server Management Studio中的现有外键:

首先,选择您的外键,并在新的查询窗口中打开它的"DROP和Create To ..".

在此输入图像描述

然后,只需添加ON DELETE CASCADEADD CONSTRAINT命令:

ñ 然后点击"执行"按钮运行此查询.

顺便说一句,要获取外键列表,并查看哪些已打开"级联删除",您可以运行此脚本:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

如果您DROP因为外键约束而发现您不能使用特定的表,但是您无法确定哪个FK导致了问题,那么您可以运行以下命令:

sp_help 'TableName'
Run Code Online (Sandbox Code Playgroud)

该文章中的SQL列出了引用特定表的所有FK.

希望这一切都有帮助.

道歉为长指.我只是想说明一点.

  • 手指立即出卖了这个答案。 (53认同)
  • 沙拉手指,DBA。 (9认同)
  • 我刚刚从搜索引擎结果页面的“删除级联图像”部分点击到此处,纯粹是因为手指。那东西是怎么回事。 (4认同)
  • 仍然从实时操作指针的视线中恢复过来,我想知道当颠倒引用表和被引用表的角色时语法应该如何工作,或者(更令人困惑的是)在从属表的列为1:1关系的情况下是PK,同时是FK的一部分。我们肯定不希望删除依赖项时删除主记录。这似乎完全取决于“ ON DELETE CASCADE”紧随“ master”列之后的事实。 (2认同)

Pal*_*mar 160

您可以使用SQL Server Management Studio执行此操作.

→右键单击表格设计并转到"关系"并选择左侧窗格和右侧窗格中的外键,展开"INSERT和UPDATE规范"菜单,然后选择"级联"作为删除规则.

SQL Server Management Studio


Hyp*_*eus 44

使用类似的东西

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

填写正确的列名称,您应该设置.正如mark_s正确陈述的那样,如果您已经有外键约束,则可能需要先删除旧的约束,然后再创建新的约束.

  • @marc_s - 实际上,你可以在两侧完全相同的列上添加第二个外键,它将正常工作.如果在没有停机的生产环境中工作,最好是引入新的FK级联,然后丢弃旧的FK,而不是在没有FK的情况下在桌面上留下一个窗口.(刚刚在SQL 2008上测试过) (39认同)

Md *_*iar 15

ON DELETE CASCADE
它指定删除父数据时删除子数据.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

对于这个外键,我们指定了一个ON DELETE CASCADE子句,它告诉SQL Server删除父表中的数据时删除子表中的相应记录.因此,在此示例中,如果从products表中删除product_id值,则还将删除使用此product_id的库存表中的相应记录.


小智 14

首先启用ONCascade属性:

1.Drop现有的外键约束

2.在启用ON DELETE CASCADE设置的情况下添加新的

例如:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END
Run Code Online (Sandbox Code Playgroud)

第二个禁用ONCascade属性:

1.Drop现有的外键约束

2.在启用ON DELETE NO ACTION设置的情况下添加新的设置

例如:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END
Run Code Online (Sandbox Code Playgroud)