我有2个表:T1和T2,它们是具有数据的现有表。T1和T2之间存在一对多关系。当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,T2中的所有相关记录也都删除了。
它们之间存在外部约束。我不想删除表或创建触发器来删除T2。例如,当我删除员工时,所有复查记录也应消失。
T1-员工,
Employee ID
Name
Status
T2-效果评论,
Employee ID - 2009 Review
Employee ID - 2010 Review
我有2个表:T1和T2,它们是具有数据的现有表。T1和T2之间存在一对多关系。当删除T1中的记录时,如何更改表定义以在SQL Server中执行级联删除,T2中的所有相关记录也都删除了。
它们之间存在外部约束。我不想删除表或创建触发器来删除T2。例如,当我删除员工时,所有复查记录也应消失。
T1-员工,
Employee ID
Name
Status
T2-效果评论,
Employee ID - 2009 Review
Employee ID - 2010 Review
Answers:
您将需要
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中的现有外键,请执行以下操作:
首先,选择您的外键,然后在新的“查询”窗口中打开它的“ DROP and Create To ..”。
然后,只需添加ON DELETE CASCADE到ADD 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
并且,如果您发现DROP由于外键约束而无法创建特定的表,但无法确定是哪个FK导致了问题,则可以运行以下命令:
sp_help 'TableName'
该文章中的SQL列出了引用特定表的所有FK。
希望所有这些都对您有所帮助。
为长手指道歉。我只是想指出一点。
您可以使用SQL Server Management Studio执行此操作。
→右键单击表设计并转到“关系”,然后在左侧窗格中选择外键,然后在右侧窗格中,展开菜单“ INSERT and UPDATE specification”,然后选择“ Cascade”作为“删除规则”。

使用类似
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
填写正确的列名,您将被设置。正如mark_s正确指出的那样,如果您已经有了外键约束,则可能需要先删除旧的约束,然后再创建新的约束。
首先启用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,
quantity 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删除子表中的相应记录。因此,在此示例中,如果从产品表中删除了product_id值,则库存表中使用该product_id的相应记录也将被删除。