2010-06-04 60 views
2

我有一個表具有LibraryID和LibraryParentID。如何刪除父母和孩子的記錄

LibraryID int Unchecked 
Name varchar(50) Checked 
Description varchar(200) Checked 
LibraryLevel int Checked 
LibraryParentID int Checked 
LibraryTypeID int Unchecked 

我想編寫一個sql來刪除當前選擇父級以及所有子級記錄,我該怎麼做?

+0

再次重新啓用它是否存在子父記錄和父記錄之間的外鍵約束? – 2010-06-04 04:05:48

回答

2

級聯刪除外鍵 這裏是一個參考http://msdn.microsoft.com/en-us/library/aa933119(SQL.80).aspx


編輯:

的評論是正確的下面。 「

」由單個DELETE或UPDATE觸發的一系列級聯參照動作必須形成一個不包含循環引用的樹,在DELETE產生的所有級聯參照動作列表中不能出現多於一次的表格或UPDATE「。從MSDN

報價,但這裏是一些TSQL,這將有助於

Create Procedure RecursiveDelete(
LibraryId Int) 
AS 
Declare @CursorLibraryID Int; 

Declare myCursor Cursor FOR 
SELECT LibraryParentID from Table; 

Open myCursor; 

Fetch Next 
From MyCursor 
Into @CursorLibraryID 

While (@@Fetch_Status = 0) BEGIN 
    Exec RecursiveDelete(@CursorLibraryID) 
    Delete From Table 
    Where LibraryID = @CursorLibraryId 
Fetch Next 
From MyCursor 
Into CursorLibraryID 

END 

那麼其後期和IM很累,所以如果語法錯了我appologize。但這裏的想法是你有孩子,父母,祖父母,偉大的祖父母等等,所以你必須遞歸刪除它們。

+0

OP要求提供SQL。在提供替代解決方案的建議之前回答原始問題通常是一個好主意。 – mdma 2010-06-04 03:53:56

+0

當父和子列在同一個表中時,無法在sql server 2005中使用級聯:(。 – user344760 2010-06-04 03:57:28

+0

使用CTE是答案。http://www.itjungles.com/microsoft-sql-server/how-to-delete-父子層次結構 - 關係 - 在-SQL服務器使用,CTE – user344760 2010-06-04 04:22:03

0

假設你沒有級聯刪除上啓用的關係,你需要做的這兩種說法:

Delete Table 
Where LibraryParentId = @Param 

Delete Table 
Where Id = @Param 
1

要刪除的庫和所有父庫,假設外鍵是一個自參考,你可以做

WITH LibAncestors(libraryID, parentID, level) AS 
(
    SELECT libraryID, libraryID, 0 
    FROM Library 
    UNION ALL 
    SELECT  a.libraryID, b.libraryParentID, a.level+1 
    FROM LibAncestors AS a INNER JOIN Library b 
    ON b.libraryID = a.parentID 
) 
DELETE FROM Library 
WHERE libraryID IN 
    (SELECT LibraryParentID FROM LibAncestors WHERE LibraryID=?) 

在這裏?是您的LibraryID要刪除的佔位符,它是父級,它是父級等。

CTE返回第一列中的libraryID和第二列中的所有祖先(包括庫本身)。

第三欄是父母離孩子有多遠。 0代表孩子本身,1代表父母,2代表祖父母,等等。如果你不想刪除所有父母,你可以在WHERE子句中指定一個限制。例如,要刪除的孩子,只是它的直接父(如問題指定)

DELETE FROM Library 
WHERE libraryID IN 
    (SELECT LibraryParentID FROM LibAncestors WHERE LibraryID=? AND level<=1) 

我不知道這是否會與庫Id定義爲libraryParentID外鍵工作。但是,您可以禁用密鑰檢查,並通過使用

ALTER TABLE Library NOCHECK CONSTRAINT ALL 
DELETE FROM Library .... 
ALTER TABLE Library CHECK CONSTRAINT ALL