nidafg 2015-05-11 15:03 采纳率: 0%
浏览 1663

一个比较复杂的级联删除问题 ,求高手指点

   是这样的,现在要做一个通用的删除方法。删除一个配置项和其关联配置项,逻辑很复杂。首先,数据库结构大概是这样的:有N个配置项,每个配置项有一张表,每个配置项通过一个中间表和其他配置项关联。有一对一,也有一对多的。所谓配置项一般都是一种设备,有序列号CI,ROWID来区分标识,每个设备有唯一的CI,但ROWID不唯一,ROWID是递增的,用HISTORY字段来区分是否在用。新增一个设备时是新生成一个CI,ROWID,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,如果栈空了,说明都删完了。现在要换一种方式,我想到的只有递归了。
  • 写回答

2条回答 默认 最新

  • nidafg 2015-05-11 16:06
    关注

    求各位大神指点,别沉了啊。。。

    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)