我有张桌子,上面有LibraryID和LibraryParentID。
LibraryID int Unchecked
Name varchar(50) Checked
Description varchar(200) Checked
LibraryLevel int Checked
LibraryParentID int Checked
LibraryTypeID int Unchecked 我想写一个sql来删除当前的select父记录和所有子记录,我该怎么做呢?
发布于 2010-06-04 11:48:13
在外键上级联删除这里是一个引用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现在已经很晚了,而且我也累了,所以如果语法错误,我很抱歉。但是这里的想法是,你有孩子,父母,祖父母,greatgrandparents...etc,所以你必须递归地删除它们。
发布于 2010-06-04 12:09:23
要删除库和所有父库(假设外键是自引用),可以执行以下操作
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)我不知道这是否适用于从libraryID到libraryParentID定义的外键。但您可以禁用密钥检查,然后使用以下命令重新启用
ALTER TABLE Library NOCHECK CONSTRAINT ALL
DELETE FROM Library ....
ALTER TABLE Library CHECK CONSTRAINT ALL发布于 2010-06-04 11:58:50
假设您没有在关系上启用cascade delete,您需要在两个语句中执行此操作:
Delete Table
Where LibraryParentId = @Param
Delete Table
Where Id = @Paramhttps://stackoverflow.com/questions/2971378
复制相似问题