SQLServer级联删除执行delete报错 约束"FK_****"冲突原因及解决办法

SQLServer级联删除执行delete报错 约束

DELETE 语句与 REFERENCE 约束"FK_staff_category"冲突。该冲突发生于数据库"beautyinfo",表"dbo.staff", column 'caID'。

在做asp.net项目时,使用sql语句删除表中项目会出现如上错误。原因是与该表项关联的子项没有删除,要先删除该项的子项才能删除该项目。就好比解散一家公司,得先遣散公司里的所有员工。

具体解决办法有两种:

方法1.在表的关联属性中设置删除表项时实现级联操作:

1.1选中目标表右击,单击“设计”

SQLServer级联删除执行delete报错 约束

1.2在表编辑页打开后,点击关系按钮

SQLServer级联删除执行delete报错 约束

1.3在对话框做如下设置

SQLServer级联删除执行delete报错 约束

1.4关闭对话框口后,别忘记在表编辑页右击保存,之后才能生效。

SQLServer级联删除执行delete报错 约束

完成设置后即可成功删除该表中的表项(如果不能保存请先设置允许修改已经建好的表 教程:https://jingyan.baidu.com/article/c33e3f48d3e20dea15cbb595.html)

 

方法2:新建索引,在删除目标表项时触发索引实现先删除子项再删除本项,从而避免出错。

2.1在目标表中新建触发器

SQLServer级联删除执行delete报错 约束

2.2新建的触发器是这个样子

SQLServer级联删除执行delete报错 约束

手动编写一下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		
-- Create date: 
-- Description:	
-- =============================================
CREATE TRIGGER trigCategoryDelete
   ON  Category
   INSTEAD OF DELETE--将delete操作替换为begin后面的操作
AS 
BEGIN
    declare @id int--指定@id的类型
    select @id=id from deleted --选中目标表项id
    delete staff where caID = @id --删除与目标id对应的子项
    delete category where id = @id --删除目标表项
END
GO

选中触发器全文执行即可生成索引,再次删除目标表项时就会自动先删除子表项再删除目标表项,从而成功删除。

需要刷新一下才能看到新生成的索引

SQLServer级联删除执行delete报错 约束

你可能感兴趣的:(asp.net)