首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除上下级记录

如何删除上下级记录
EN

Stack Overflow用户
提问于 2010-06-04 11:46:23
回答 3查看 4.3K关注 0票数 2

我有张桌子,上面有LibraryID和LibraryParentID。

代码语言:javascript
复制
LibraryID int Unchecked
Name varchar(50) Checked
Description varchar(200) Checked
LibraryLevel int Checked
LibraryParentID int Checked
LibraryTypeID int Unchecked 

我想写一个sql来删除当前的select父记录和所有子记录,我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2010-06-04 11:48:13

在外键上级联删除这里是一个引用http://msdn.microsoft.com/en-us/library/aa933119(SQL.80).aspx

编辑:

评论就在下面。

“由单个DELETE或UPDATE触发的一系列级联引用操作必须形成一个不包含循环引用的树。任何表都不能在由DELETE或UPDATE产生的所有级联引用操作的列表中出现多次。”引用自MSDN

但是这里有一些tsql将会有所帮助。

代码语言:javascript
复制
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,所以你必须递归地删除它们。

票数 2
EN

Stack Overflow用户

发布于 2010-06-04 12:09:23

要删除库和所有父库(假设外键是自引用),可以执行以下操作

代码语言:javascript
复制
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子句中指定限制。例如,删除子项并仅删除其直接父项(如问题中所指定)

代码语言:javascript
复制
DELETE FROM Library 
 WHERE libraryID IN 
    (SELECT LibraryParentID FROM LibAncestors WHERE LibraryID=? AND level<=1)

我不知道这是否适用于从libraryID到libraryParentID定义的外键。但您可以禁用密钥检查,然后使用以下命令重新启用

代码语言:javascript
复制
ALTER TABLE Library NOCHECK CONSTRAINT ALL
DELETE FROM Library ....
ALTER TABLE Library CHECK CONSTRAINT ALL
票数 1
EN

Stack Overflow用户

发布于 2010-06-04 11:58:50

假设您没有在关系上启用cascade delete,您需要在两个语句中执行此操作:

代码语言:javascript
复制
Delete Table
Where LibraryParentId = @Param

Delete Table
Where Id = @Param
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2971378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档