簡體   English   中英

SQL Server 2008-添加具有約束的自引用外鍵並獲得“找不到數據類型”錯誤

[英]SQL Server 2008 - Adding self-referencing foreign key with constraint and getting “Cannot find data type” error

我正在使用SQL Server 2008,並且嘗試添加具有ON DELETE CASCADE約束的自引用外鍵,但是遇到了一些問題。 基本上,我希望系統在刪除節點時自動刪除節點的所有子級。

我有一個具有以下基本結構的表Node

  • PK_Node_Id(主鍵)
  • ParentNodeId(想使它成為具有ON DELETE CASCADE約束的自引用外鍵。

問題出在我嘗試添加約束時。 如果使用GUI設計器,則“ 插入”和“更新規范”選項將顯示為灰色,並且我無法執行任何操作。

如果我嘗試運行SQL語句來添加約束:

ALTER TABLE Node
ADD CONSTRAINT
FK_Node_Node
FOREIGN KEY (ParentNodeId)
REFERENCES Node (PK_Node_Id)
ON DELETE CASCADE;

我收到以下錯誤:

Cannot find data type FK_Node_Node.

FK_Node_Node是我的外鍵的名稱。 不確定為什么要查詢或尋找數據類型...

謝謝你的幫助!

我收到以下錯誤:找不到數據類型FK_Node_Node。

我懷疑您在運行ALTER TABLE語句時拼錯了“ CONSTRAINT”一詞。 該聲明結果依然是語法上有效,但不是增加一個外鍵約束,它增加了一個名為(例如)型FK_Node_Node的“CONSTAINT”一 ,外加一個未命名的外鍵約束。

我希望系統在刪除節點時自動刪除節點的所有子級。

不幸的是,這是不可能的:SQL Server不允許級聯引用動作形成循環。 ALTER TABLE語句應該給您的錯誤是:

在表“節點”上引入外鍵約束“ FK_Node_Node”可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

代替使用ON DELETE CASCADE,您需要自己執行遞歸刪除:

;WITH Nodes (PK_Node_Id) AS
(
    SELECT PK_Node_Id
    FROM Node
    WHERE PK_Node_Id = @NodeId  -- @NodeId is the root node you want to delete

    UNION ALL

    SELECT Child.PK_Node_Id
    FROM Node Child JOIN Nodes Parent ON Parent.PK_Node_Id = Child.ParentNodeId
)
DELETE FROM Node
WHERE PK_Node_Id IN (SELECT PK_Node_Id FROM Nodes)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM