Sql 关于删除级联错误-如何使用触发器解决它?
我在SQL Server 2012中创建一些表的查询如下: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
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