2010-08-12 129 views
2

表结构删除Reccords - SQL Server 2008的

ID  DESC    PARENT_ID** 

35151 Parent   35154 
35152 System   35151 
35153 Same as System 35151 
35154 ParentsParent  35157 
35156 Product   35157 
35157 Login Group  35159 

Id是主键,PARENT_ID是在同一个表中引用的外键

如何我从最后一个孩子开始递归删除记录,直到父母。如果没有子记录,则应删除父记录。如果发生奇怪的事情,我需要使用回滚事务。帮助表示赞赏

回答

1

看这个问题:

SQL Server: Self-reference FK, trigger instead of ON DELETE CASCADE

随着对FK DELETE CASCADE不会在SQL Express 2005的作品,可能是它会在2008年

ALTER TABLE SomeChildTable 
CONSTRAINT YOurConstraintName 
FOREIGN KEY (YourParentId) 
REFERENCES YourParentTable(ParentTableId) ON DELETE CASCADE; 
+0

我不能使用触发器截至目前。我可以不用触发器吗? – SRA 2010-08-12 10:36:55

+0

@Sunil Ramu,我已经更新了答案,但它无法在MSSQL中使用,但请尝试。 – 2010-08-12 10:52:05

5

你可以工作使用递归CTE来获取要删除的列表。

https://data.stackexchange.com/stackoverflow/query/9287/so3466713

-- SO3466713 

CREATE TABLE #t (
    ID int NOT NULL 
    ,[DESC] varchar(50) NOT NULL 
    ,PARENT_ID int NULL 
) 

INSERT INTO #t VALUES 
(35151, 'Parent', 35154) 
,(35152, 'System', 35151) 
,(35153, 'Same as System', 35151) 
,(35154, 'ParentsParent', 35157) 
,(35156, 'Product', 35157) 
,(35157, 'Login Group', 35159) 

;WITH tree AS (
    SELECT * 
    FROM #t 
    WHERE [DESC] = 'Parent' 

    UNION ALL 

    SELECT c.* 
    FROM #t AS c 
    INNER JOIN tree AS p 
     ON c.PARENT_ID = p.ID 
) 
-- SELECT * 
-- FROM tree 
DELETE FROM #t WHERE ID IN (SELECT ID FROM tree) 

SELECT * FROM #t​ 
+0

描述只是一个文本。请忽略它。重要的是ID和ParentId。 – SRA 2010-08-12 11:03:11

+0

@Sunil Ramu - [DESC]只是用来识别你想删除的树。您可以放置​​任何标准来标识您需要从中删除所有子项的根节点。 – 2010-08-12 11:04:41

+0

+1,很好的示例代码 – 2010-08-12 12:54:35