要刪除的庫和所有父庫,假設外鍵是一個自參考,你可以做
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
再次重新啓用它是否存在子父記錄和父記錄之間的外鍵約束? – 2010-06-04 04:05:48