为了备案,删除功能并不采用delete语句,而是采用 设置一个 删除标记 delflag为真的方式。
这种方式下的一个问题是,表的主键该怎么设?因为没有 delflag之前,可以有个id,但有delflag之后,同一个id(比如身份证号) 对应delflag真假的可能就有2或3条记录。遇到这种情况 大家怎么处理?谢谢

解决方案 »

  1.   

    如果主键重复 把delflag 也追加到主键里面去
      

  2.   


    是的,这个建议不错。你可以有两张表,一个是真正生效的id 正式表,一个是被删除之后用来备案的id 表。
    正式表 当然可以以id 为主键,备用表没有太大关系。
    当需要查看备案时,可以直接查看备用表,或者可以把正式表和备用表union 起来做个视图。
      

  3.   

    我也遇到同样的问题,我的解决方法是:建唯一索引
    CREATE UNIQUE INDEX UIDX_TEST
    ON TABLE(DECODE(delflag,0,id));
    但是使用函数索引查询时有问题,所以为了查询需要另外建一个索引
    CREATE INDEX IDX_TEST
    ON TABLE(id,delflag);
      

  4.   

    最好不要用日期做主键吧, 而且现在表格主键往往都是无意义的ID值, 删除的移动操作可以考虑触发器, 我记得有一个instead of类型的触发器, 不过那是针对视图的, 现在有些程序不直接操作表格而是mapping给一些view, 通过view跟应用层建立关系, 保持接口一致