樹形結構閉包表架構及操作方法
阿新 • • 發佈:2020-12-17
資料表
dept 部門表
- ID 主鍵
- parent_id 父ID
- name 部門名稱
dept_path 部門路徑表
- parent_id 父ID 聯合主鍵
- son_id 子ID 聯合主鍵
資料結構
操作
新增節點 12 到 7 下
INSERT INTO b_dept_path(parent_id, son_id)
SELECT d.parent_id, 12
FROM b_dept_path AS d
WHERE d.son_id = 7
UNION ALL
SELECT 12, 12
刪除節點3
- 刪除節點3及其子節點的路徑關係記錄
DELETE FROM b_dept_path WHERE son_id IN (SELECT son_id FROM b_dept_path WHERE parent_id = 3)
移動節點4 到 節點6下
- 第一步刪除 "節點4及其子節點" 與 "節點4父節點"的關係 保留 "節點4" 與 "其子節點的關係"
DELETE FROM b_dept_path WHERE parent_id IN (SELECT parent_id FROM b_dept_path WHERE son_id = 4) AND son_id IN (SELECT son_id FROM b_dept_path WHERE parent_id = 4) and parent_id != 4;
- 第二步插入 "節點4及其子節點" 與 "節點5與其父節點的關係"
- 這裡用到了 cross join,具體用法參考
INSERT INTO b_dept_path(parent_id, son_id)
SELECT
p.parent_id,
s.son_id
FROM
b_dept_path p
CROSS JOIN b_dept_path s
WHERE
p.son_id = 6
AND s.parent_id = 4;