2013-07-31 115 views
8

我有以下DDL,我與SQL Server 2012使用:我是否需要在我的外鍵上指定ON DELETE NO ACTION?

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 NO ACTION 

我要的是SQL Server停止我刪除家長如果給家長參考的孩子存在?例如,我想要刪除SubjectID = 3的主題將失敗,如果有子項的SubjectId爲3.

對此,我不清楚,似乎無法找到答案。我是否需要添加「DELETE NO ACTION」或者我可以不刪除這三個詞。

我在問這個問題,因爲在一個類似的問題中,我有一個迴應,我應該定義父級的觸發器。不過,我認爲只是定義外鍵將阻止我刪除父母,如果一個孩子存在。

回答

19

從column_constraint頁面上MSDN

ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}

指定如果這些 行具有參照關係,並且從父表中刪除引用的行 ,那麼表中被更改的行將發生什麼操作。缺省值是無動作

所以,如果你願意,你可以省略ON DELETE NO ACTION,它的工作原理是一樣的。

NO ACTION表示當您從主題表中刪除主題表時什麼都不會發生。在這種情況下,如果在Topic中有一行給定的SubjectId,則不能在不破壞引用完整性的情況下從其中刪除,因此Delete將被回滾。

更多來自MSDN:

NO行動 - SQL Server數據庫引擎將引發錯誤,並在父表中的行 刪除操作回滾。

+0

Dave - 我很抱歉,但我有點困惑於「指定如果表中被更改的行發生什麼操作,如果這些行具有參照關係並且被引用的行從父表中刪除。」這是什麼意思,因爲它涉及我的主題和主題表? – Melina

+0

是主題是父和主題是子表。 – DaveShaw

+0

更新了我的答案。 – DaveShaw

1

您可以刪除關鍵字(這是默認值)

ON DELETE NO ACTION 

會更好,指定這些行動

ON DELETE CASCADE 

下面是詳細信息如下:http://msdn.microsoft.com/en-us/library/aa933119%28v=sql.80%29.aspx

你必須寫一個觸發器,以確保子行不會被刪除,因爲我不認爲SQL Server有這個選項ON DELETE RESTRICT

+0

好吧,那麼你說有DELETE NO ACTION是一樣的,我沒有放任何東西? DELETE RESTRICT是新東西,所以我會試着檢查一下。 – Melina

+0

是不是隻限制Oracle? – DaveShaw

+0

@DaveShaw Yup,剛剛意識到它,我已經更新了相同的,謝謝 – Akash

1

我會告訴你,雖然你可以跳過刪除沒有任何操作,但這可能不符合你的最佳利益。在表定義中指定後,可能會阻止某人稍後添加級聯刪除,因爲他們發現您希望這種情況不會發生。當您正確編寫所有數據庫對象並將它們放在源代碼管理中時,這一點尤其如此,代碼審查人員會發現存在差異並詢問其發生的原因。很多時候,人們太急於添加刪除級聯並銷燬應該保留的數據(例如對於不再有效的客戶的財務記錄)。他們這樣做是因爲他們得到的錯誤不會讓他們刪除,只是想擺脫它,而不是意識到這是從一個大錯誤中拯救他們。至少如果您的表腳本中有Delete No Action代碼,未來的維護人員會看到這是故意的,而不僅僅是您忘記設置級聯刪除。當然,如果您的dba不允許級聯刪除(因爲許多人不這樣做並且有充分理由!),那麼這不是一個潛在的問題,但指定您的意圖通常對於可維護性來說是一件好事。

相關問題