2013-07-31 72 views
0

我有以下DDL,我與SQL Server 2012使用:如果引用該父項的子實體存在,如何停止對父項的刪除?

CREATE TABLE Subject (
    [SubjectId] INT IDENTITY (1, 1) NOT NULL, 
    [Name] NVARCHAR (50) Not NULL, 
    CONSTRAINT [PK_Subject] PRIMARY KEY CLUSTERED ([SubjectId] ASC) 
)   

CREATE TABLE Topic (
    [TopicId] INT IDENTITY (1, 1) NOT NULL, 
    [Name] NVARCHAR (50) NOT NULL, 
    [SubjectId] INT NOT NULL, 
    CONSTRAINT [PK_Topic] PRIMARY KEY CLUSTERED ([TopicId] ASC) 
) 
ALTER TABLE [Topic] WITH CHECK ADD CONSTRAINT [FK_TopicSubject] 
    FOREIGN KEY([SubjectId]) REFERENCES [Subject] ([SubjectId]) 
    ON DELETE CASCADE 

CREATE TABLE SubTopic (
    [SubTopicId] INT IDENTITY (1, 1) NOT NULL, 
    [TopicId] INT NOT NULL, 
    [Name] NVARCHAR (4000) Not NULL, 
    CONSTRAINT [PK_SubTopic] PRIMARY KEY CLUSTERED ([SubTopicId] ASC) 
) 

ALTER TABLE [SubTopic] WITH CHECK ADD CONSTRAINT [FK_SubTopicTopic] 
    FOREIGN KEY([TopicId]) REFERENCES [Topic] ([TopicId]) 
    ON DELETE CASCADE 

當我嘗試運行腳本,我得到以下信息:

{"Introducing FOREIGN KEY constraint 'FK_TopicSubject' 
on table 'Topic' may cause cycles or multiple cascade paths. 
Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, 
or modify other FOREIGN KEY constraints.\r\nCould not create constraint. 
See previous errors."} 

我真正需要的是噹噹有刪除主題出現故障時,某個人試圖刪除主題。如果我既不包含DELETE ON CASCADE DELETE NO ACTION,也會發生這種情況。如果不是,那麼如果有關於該主題的主題,如何才能停止主題上的刪除?

+0

我看這幾個地方後仍不清楚。 「ON DELETE NO ACTION」與我在該行中沒有包含DELETE的任何內容有區別嗎? – Melina

回答

1

請參閱此鏈接。它詳細解釋了這個錯誤,並且還建議創建一個觸發器作爲替代。 Foreign key constraint may cause cycles or multiple cascade paths?

+1

另外我想補充一點,你會得到這個錯誤,因爲當你從主題表中刪除一行時,SQL服務器將從主題表中刪除一行(在刪除級聯上),然後它會嘗試從行中刪除一行子主題表。所以在這裏您可以看到系統正在計算級聯路徑,並避免任何最壞情況下它試圖避免任何多級Cascade。 – Sonam

+0

感謝您的解釋。如果我沒有「ON DELETE CASCADE」,並且當我嘗試刪除主題時主題表中仍有某些內容,那麼這會導致錯誤並導致DELETE失敗? – Melina

+0

我是否需要「ON DELETE CASCADE」或「ON DELETE NO ACTION」我可以不擁有嗎? – Melina

0

簡短的回答是:如果你不想級聯更新和刪除,然後使用ON DELETE NO ACTION。同樣適用於更新。

這裏是MSDN article(這是SQL Server 2000的,但同樣的規則仍然適用)

ON DELETE NO ACTION

指定副本,如果試圖刪除行與國外引用的關鍵鍵在其他表中的現有行中,則會引發錯誤並回滾DELETE。

ON UPDATE NO ACTION

指定如果試圖更新的行,其關鍵是通過外鍵與現有的其它錶行引用的鍵值,產生一個錯誤,並且更新推出背部。

相關問題