数据库树状结构的关系表的删除方案
生活随笔
收集整理的這篇文章主要介紹了
数据库树状结构的关系表的删除方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? 所謂的樹狀結構的關系,即是記錄之間有id,parentId關系的數據。場景是這樣的:業務中用到了一張分享表,表里的主要字段有分享人,和被分享人,以及分享任務ID,可以通過一系列的分享構造成樹狀的結構,需求是刪除任意的節點,需要刪除節點下面的所有分享關聯的數據。
? ? 方案1:可以把每個節點用一個標識將分享關系串起來拼接成一個字符串,表里增加一個字段記錄這個路徑字符串,刪除節點時條件是只有包含節點關系記錄的路徑就刪除,這種方案的靈感來自于windows創建文件夾的模式,每個文件夾都對應一個唯一的路徑,刪除某個文件夾下面相關的文件都都會被刪除。
? ?方案2:通過觸發器,監聽分享表的刪除操作,刪除數據時,將已刪除的數據的被分享人作為分享人查詢相關的記錄,并干掉,以此類推,遞歸刪除。但是這樣的操作只能遞歸操作小于32層,否則將報錯,而且這種遞歸調用性能也不好。不過可以借此學習下觸發器的使用
ALTER TRIGGER [dbo].[myFirstTrigger] ON [dbo].[ShareTable] FOR DELETE AS BEGIN--SET NOCOUNT ON;DECLARE @id INT,--分享ID;@customer VARCHAR(200),@tocustomer VARCHAR(200),@taskId VARCHAR(100)--SELECT @id=id,@customer=customer,@tocustomer=tocustomer FROM DELETED;DELETE FROM dbo.ShareTable WHERE customer IN (SELECT tocustomer FROM DELETED) END? 方案3:通過cte遞歸,查詢相關聯的數據,他沒有遞歸層級的限制,使用簡單方便,此方案為最終確定方案。
? ? ? ? ? ? cte的用法主要有2個方面,1是用作一個臨時結果集,2是專門用來類似的遞歸
? ? ? ? ? ? 具體遞歸實現代碼如下:
WITH SimpleRecursiveAS (--基本語句 指定一條記錄SELECT id,customer ,tocustomerFROM dbo.ShareTableWHERE customer = '分享人'AND tocustomer = '被分享人'AND id=1 UNION ALL--遞歸語句SELECT p.id,p.customer ,p.tocustomerFROM dbo.ShareTable PINNER JOIN SimpleRecursive A ON A.tocustomer = P.customer)SELECT id FROM SimpleRecursive --獲取所有匹配id? ?
? ?
轉載于:https://www.cnblogs.com/JaggerMan/p/4535919.html
總結
以上是生活随笔為你收集整理的数据库树状结构的关系表的删除方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: error Infos
- 下一篇: mysql三学习sql声明学习