2017-04-03 21 views
0

我的查詢創建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 
) 

,誤差

在介紹 表 'Poll_Vote_Table' FOREIGN KEY約束 'FK__Poll_Vote__PollA__5A3A55A2' 可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他的FOREIGN KEY約束。 我該如何解決這個問題

+0

標記您正在使用的dbms。另外添加其他兩個表定義。 – jarlh

+0

爲什麼在刪除下表中的記錄之後要從主表中刪除? – Whencesoever

回答

0

他們有很多方法可以解決您的問題。我將只提供兩種解決方案:

1-最簡單的一個:將您的表Poll_Vote_Table更改爲兩個表中的問題,一個用於答案。

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 

更新部分通常沒用,所以我不會寫這個,但它基本上和DELETE一樣。

+0

僅供參考,您也可以在刪除後使用'CREATE TRIGGER [DELETE_Question_Vote] ON dbo。[Poll_Question_Table] FOR DELETE AS''您不需要FK了。它可以創建一種「安全代碼」。 – Lostblue