Sql 关于删除级联错误-如何使用触发器解决它?

Sql 关于删除级联错误-如何使用触发器解决它?,sql,sql-server,Sql,Sql Server,我在SQL Server 2012中创建一些表的查询如下: create table Poll_Question_Table ( PollQuestionId int primary key, PollQuestionTex varchar(max), PollStatus int , PollStartDate date, PollEndDate date, PollCatagoryId int foreign key references Po

我在SQL Server 2012中创建一些表的查询如下:

create table Poll_Question_Table (
    PollQuestionId int primary key,
    PollQuestionTex varchar(max),
    PollStatus int ,
    PollStartDate date,
    PollEndDate date,
    PollCatagoryId int foreign key references Poll_Catagory_Table on update cascade on delete cascade  
)

create table Poll_Catagory_Table(
    PollCatagoryId int primary key,
    PollCatagoryName varchar(100),
    PollCatagoryDescription varchar(max)
)

create table Poll_Answer_Table(
    PollAnswerId int primary key,
    PollAnswerText varchar(max),
    PollQuestionId int foreign key references Poll_Question_Table on update cascade on delete cascade
)

create table Poll_Vote_Table (
    PollVoteId int primary key,
    PollQuestionId int foreign key references Poll_Question_Table on update cascade on delete cascade ,
    PollAnswerId int foreign key references Poll_Answer_Table on update cascade on delete cascade,
    PollCount int 
)
错误是

在上引入外键约束“FK__Poll_Vote_PollA__5A3A55A2” 表“Poll\u Vote\u table”可能导致循环或多个级联路径。 指定在删除时不执行操作或在更新时不执行操作,或修改其他 外键约束。 我如何解决这个问题


他们有很多方法来解决你的问题。我将仅介绍两种解决方案:

1-最简单的一个:将你的投票表改为两个,一个用于提问,一个用于回答

2-使用触发器而不是删除/更新。它实际上是你想要的,但是请考虑解决方案1。现在,使用trigger()的代码如下:

(我将仅对问题部分进行说明。答案是一样的。)

首先,您必须按如下方式重新创建FK(删除后):

然后需要创建触发器:

CREATE TRIGGER [DELETE_Question_Vote]
   ON dbo.[Poll_Question_Table]
   INSTEAD OF DELETE
AS 
BEGIN
 SET NOCOUNT ON;
 DELETE FROM [Poll_Vote_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
 DELETE FROM [Poll_Question_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
END
GO

更新部分通常是无用的,所以我不会写它,但它基本上与删除相同。

标记您正在使用的dbms。同时添加其他两个表定义。为什么要在删除下表中的记录后从主表中进行删除?为了了解更多信息,您还可以使用dbo上的
创建触发器[delete\u Question\u Vote]。[Poll\u Question\u table]进行删除操作,这样您就不再需要FK了。它可以创建一种“安全代码”。
CREATE TRIGGER [DELETE_Question_Vote]
   ON dbo.[Poll_Question_Table]
   INSTEAD OF DELETE
AS 
BEGIN
 SET NOCOUNT ON;
 DELETE FROM [Poll_Vote_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
 DELETE FROM [Poll_Question_Table] WHERE PollQuestionId IN (SELECT PollQuestionId FROM DELETED)
END
GO