sqlsever数据库表中数据如下:
编码 名称 父级编码
aa 测试1 0
zg 测试5 aa
bb 测试2 aa
cc 测试3 bb
dd 测试4 cc
数据库表中数据aa是根节点、父级,有两个子级zg、bb;子级bb又有子级cc和子级cc的子级dd
若删除根节点aa,除了删除zg、bb外,如何删除bb下面的cc、dd;或删除子级bb时,如何删除cc、dd
递归删除吧
有个思路,PARENT_ID创建一个外键,这个外键指向表的ID,并且设置外键的策略,我记得有一个策略是级联。
如果这样的话就要更改表结构了。。。
@小白学无止境: 严格来说不算修改,只是在原有的基础上新增
如果不想改表結構,那就写个递归代码呗。
如果不想写递归代码,或者不会写,那就找别人帮忙写呗。
sql递归
在不产生垃圾数据前提下删除的逻辑是:1.删除子表 2.通过主外键关系删除父表。如果从表数据未删除时,正常情况下删除主表数据是不允许的。
这个问题换个思路其实好办。
思路1:递归遍历 但是效率低
思路2:记录节点的全路径
如下设计:
这样删除的时候就可以 通过路径匹配删除父节点下的所有节点,效率也高。(http://www.52interview.com/ (_)
我在设计程序的时候,所有的pid都不会采用自带的id自增,类似这种,我会使用 where 1%来删除,如
编码 名称 父级编码
1 测试1 0
11 测试5 1
12 测试2 1
121测试3 12
1211 测试4 121
那么在查询的时候如果删除所有1的那么 where1% 如果是删除11% 121%类似,这属于很简单的老生常谈的数据权限问题