如何使用SQL Server级联删除?

我有2个表:T1和T2,他们是现有的数据表。 我们在T1和T2之间有一对多的关系。 如何删除T1中的logging时,如何更改表定义以在SQL Server中执行级联删除,同时还删除了T2中的所有关联logging。

他们之间存在着外来的约束。 我不想删除表或创build触发器来删除T2。 例如,当我删除一个员工时,所有的审核logging也应该消失。

T1 – 员工,

Employee ID Name Status 

T2 – 性能评测,

 Employee ID - 2009 Review Employee ID - 2010 Review 

你将需要,

  • 删除现有的外键约束,
  • ON DELETE CASCADE设置启用的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 

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

首先,select您的外键,并在新的查询窗口中打开它的“DROP and Create To ..”。

在这里输入图像描述

然后,将ON DELETE CASCADE添加到ADD CONSTRAINT命令:

ñ 然后点击“执行”button来运行这个查询。

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

 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 

如果您发现由于外键约束而无法DROP特定的表,但无法确定哪个FK导致了问题,那么您可以使用我在此处提供的SQL:

如何列出在SQL Server中引用给定表的所有外键?

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

希望这一切都有帮助。

特别是长指。

你可以用SQL Server Management Studio来做到这一点。

→右键单击表格devise,select关系,然后在左侧窗格和右侧窗格中select外键,展开菜单“插入和更新规范”,select“级联”作为删除规则。

SQL Server Management Studio

使用类似的东西

 ALTER TABLE T2 ADD CONSTRAINT fk_employee FOREIGN KEY (employeeID) REFERENCES T1 (employeeID) ON DELETE CASCADE; 

填写正确的列名称,你应该设置。 正如mark_s正确说明的那样,如果你已经有一个外键约束,你可能需要先删除旧的,然后创build一个新的。

首先启用ONCascade属性:

1.删​​除现有的外键约束

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 

其次要禁用ONCascade属性:

1.删​​除现有的外键约束

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 

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,数量INT,min_level INT,max_level INT,CONSTRAINT fk_inv_product_id FOREIGN KEY(product_id)REFERENCES products(product_id)ON DELETE CASCADE);

对于这个外键,我们指定了ON DELETE CASCADE子句,它告诉SQL Server删除父表中的数据时删除子表中相应的logging。 因此,在此示例中,如果从产品表中删除了product_id值,那么使用此product_id的库存表中的相应logging也将被删除。

我认为你不能只删除表属性,如果这是实际的生产数据,只是删除不影响表模式的内容。