树形结构闭包表架构及操作方法
数据表
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,具体用法参考 https://www.cnblogs.com/jepson6669/p/9425491.html
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;
参考链接
如有疑问欢迎留言沟通交流 彦桢博客