我想刪除子表上的行。我收到錯誤刪除子項時是否在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
但是,怎樣才能刪除一個孩子(不是父)在此設置有問題?
是否可以刪除的行當前是無效的,可能是在約束尚未使用的時候添加的),那麼在刪除具有無效外鍵的子節點時,現在約束被強制執行了嗎?
不應該有沒有有效的父母的任何子行。仍然對你進行重新檢查。 – Kangkan 2013-02-15 12:33:26
我建議你爲這兩個表格生成創建腳本。在測試數據庫中重新創建表。通過在測試數據庫的父項和子項中插入一些值進行測試。嘗試刪除它們,看看你能否弄清楚。如果你不知道出了什麼問題,請在此處重新發布創建表腳本和測試插入/刪除語句。發佈創建/插入/刪除腳本會說不止千言萬語的描述:) – mortb 2013-02-15 12:39:24
您也可以通過http://SQLFiddle.com/向我們展示您的問題 – mortb 2013-02-15 12:40:23