2013-02-15 41 views
0

我想刪除子表上的行。我收到錯誤刪除子項時是否在DELETE上實施了外鍵約束?

DELETE語句衝突與基準約束 「FK_Address_UserDataSet」。衝突發生在 數據庫「XYZ」,表「dbo.Address」,列 'DataSetId'。該語句已終止。

我有一個父UserDataSet和孩子Address表(其中父可以有任意數量的孩子的)的數據庫結構。

有一個外鍵約束(在錯誤中提到),它要求子節點DataSetId與有效的UserDataSet相關。

下面是表和約束的腳本,以簡化形式與MS SQL Server Management Studio 2008創建:

CREATE TABLE [dbo].[Address](
    [AddressId] [int] IDENTITY(1,1) NOT NULL, 
    [DataSetId] [int] NOT NULL, 
     --other fields 
CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED 
(
    [AddressId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

--- 

CREATE TABLE [dbo].[UserDataSet](
    [DataSetId] [int] IDENTITY(1,1) NOT NULL, 
     --other fields 
CONSTRAINT [PK_UserDataSet] PRIMARY KEY CLUSTERED 
(
    [DataSetId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

---Create the constraint 

ALTER TABLE [dbo].[Address] WITH NOCHECK ADD CONSTRAINT [FK_Address_UserDataSet] FOREIGN KEY([DataSetId]) 
REFERENCES [dbo].[UserDataSet] ([DataSetId]) 
GO 

ALTER TABLE [dbo].[Address] CHECK CONSTRAINT [FK_Address_UserDataSet] 
GO 

但是,怎樣才能刪除一個孩子(不是父)在此設置有問題?

是否可以刪除的行當前是無效的,可能是在約束尚未使用的時候添加的),那麼在刪除具有無效外鍵的子節點時,現在約束被強制執行了嗎?

+1

不應該有沒有有效的父母的任何子行。仍然對你進行重新檢查。 – Kangkan 2013-02-15 12:33:26

+1

我建議你爲這兩個表格生成創建腳本。在測試數據庫中重新創建表。通過在測試數據庫的父項和子項中插入一些值進行測試。嘗試刪除它們,看看你能否弄清楚。如果你不知道出了什麼問題,請在此處重新發布創建表腳本和測試插入/刪除語句。發佈創建/插入/刪除腳本會說不止千言萬語的描述:) – mortb 2013-02-15 12:39:24

+1

您也可以通過http://SQLFiddle.com/向我們展示您的問題 – mortb 2013-02-15 12:40:23

回答

1

你爲什麼要用NOCHECK添加約束?

MSDN documentation ...

如果你不想驗證新的CHECK或外鍵約束 對現有的數據,使用WITH NOCHECK。 我們不建議您這樣做 ,除了在極少數情況下。新約束將在 以後的所有數據更新中進行評估。當添加約束時,通過WITH NOCHECK抑制 的任何約束違規可能會導致未來更新 在更新行時使用不符合 約束的數據。

+0

好點,這很可能是問題的根源。但是現在該怎麼辦,甚至連我都無法刪除? – Marcel 2013-02-15 14:27:09

+1

在應用外鍵約束之前,您需要確保參照完整性。你使用了什麼DELETE語句?我原以爲你可以刪除有無效父項的子記錄...... – 2013-02-15 22:11:35

+0

刪除語句通過Linq到SQL,所以我現在無法確切地說。但我認爲刪除孩子也不成問題 - 這就是這個問題的全部內容...... – Marcel 2013-02-16 21:36:27