2010-08-12 178 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