问题描述
- 一个比较复杂的级联删除问题 ,求高手指点
-
是这样的,现在要做一个通用的删除方法。删除一个配置项和其关联配置项,逻辑很复杂。首先,数据库结构大概是这样的:有N个配置项,每个配置项有一张表,每个配置项通过一个中间表和其他配置项关联。有一对一,也有一对多的。所谓配置项一般都是一种设备,有序列号CI,ROWID来区分标识,每个设备有唯一的CI,但ROWID不唯一,ROWID是递增的,用HISTORY字段来区分是否在用。新增一个设备时是新生成一个CIROWID,HISTORY为1,表示在用。而更新时是保留当前CI,插入一条新记录,ROWID变了,把以前CI对应的那条记录的HISTORY置0,表示不在用。新增和修改时都要对和其他配置项的关系表做类似的操作,关系表存放的都是两个配置项的ROWID和HISTORY。这个我已经搞定了。 问题是删除。删除是逻辑删除,就是把自己,还有关联的其他HISTORY都置零,没有DELETE FROM。关联的其他配置项有的是级联删除,也就是要把关联的另一个配置项主表的HISTORY也置零,有的是断开关系即可,就是把中间表HISTORY置零即可。数据库有表来维护每个配置项和哪些配置项有关联,要级联删除还是断开关系,有deleteType标识。现在的问题是,删除的时候自然会先把自己删除,但是要删除对应配置项时就麻烦了。因为关联的子配置项有的是级联删除,有的是断开关系。断开关系好办,直接把对应的关系表HISTORY置零即可。麻烦的是级联删除时,子配置项也会指向其他配置项,指向那些配置项时又要判断是级联还是断开关系。这可能就需要递归来解决了。我想不到怎么办。 写几行伪代码来帮助理解吧,求大神耐心看下,帮忙出个主意。 String entityId = ""AAA"" //要删除的主配置项代号 String ci = ""XXX""; //要删除的主配置项ci String rowId = ""YYY""; //要删除的主配置项rowId UPDATE tab SET HISTORY='0' WHERE ROW_ID='rowId'; //删除 List list = findRelEntities(entityId); //查找和主配置项关联的配置项 然后我就不知道怎么办了。。。我想到的一个思路是用递归,可是不知道具体怎么实现,以前有个做法是用Stack,栈的方式。找到要级联删除的就往里面push,用的时候pop,如果栈空了,说明都删完了。现在要换一种方式,我想到的只有递归了。
解决方案
求各位大神指点,别沉了啊。。。
解决方案二:
触发器不是可以解决这个问题么?为什么要在代码里动脑筋?
时间: 2024-12-02 09:38:42