【问题标题】:On delete cascade error - How can I solve it with trigger?删除级联错误 - 如何使用触发器解决它?
【发布时间】:2017-04-03 07:23:47
【问题描述】:

我在 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 
)

错误是

引入 FOREIGN KEY 约束 'FK__Poll_Vote__PollA__5A3A55A2' on 表 'Poll_Vote_Table' 可能会导致循环或多个级联路径。 指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 外键约束。 我该如何解决这个问题

【问题讨论】:

  • 标记您正在使用的 dbms。也添加其他两个表定义。
  • 为什么要在删除了下表的记录后从主表中删除?

标签: sql sql-server


【解决方案1】:

他们有很多方法可以解决您的问题。我将只介绍两种解决方案:

1- 最简单的一个:将您的 Poll_Vote_Table 表更改为 2 个表,一个用于问题,一个用于答案。

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

(我将仅对问题部分进行说明。对于答案,它是相同的。)

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

ALTER TABLE [dbo].[Poll_Vote_Table]  WITH CHECK 
ADD CONSTRAINT [FK_Vote_Question] FOREIGN KEY([PollQuestionId])
REFERENCES [dbo].[Poll_Question_Table] ([PollQuestionId])

然后你需要创建触发器:

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

update部分一般没什么用,我就不写了,不过和DELETE基本一样。

【讨论】:

  • 仅供参考,您也可以使用CREATE TRIGGER [DELETE_Question_Vote] ON dbo.[Poll_Question_Table] FOR DELETE AS 进行后删除,您将不再需要 FK。它可以创建一种“安全代码”。
猜你喜欢
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多