通常的业务系统中为了防止认为操作失误,造成误删数据,都要求对于删除操作只执行逻辑删除,即假删除。常见的做法添加删除标识字段,用户操作删除时更新删除标识字段来达到目的。但是当遇到表中需要有唯一性索引时则会造成问题。
案例
创建一个商品编码为A110
的商品,商品编码为该表的唯一性索引,此时对该商品进行删除后,无法再次添加商品编码为A110
的商品。
将删除标识加入唯一索引
把商品编码和删除标识设置为复合唯一索引,删除A110
商品后可以再次新建一个A110
,解决了上述问题。但是此时需要再次删除A110
商品时则会出现无法删除。
再添加一个token标识
将商品编码与token标识设置为复合唯一索引,删除记录时将ID存入token标识中,这样每次删除时由于ID不一致则不会导致无法删除的情况。需要注意的是这样删除操作将会无法批量处理,必须逐条更新
最终解决方案
将商品编码与删除标识设置为复合唯一索引,每次删除时将删除标识设置为NULL,由于NULL不会与其他字段有组合唯一的效果,所以完美的解决了逻辑删除保留唯一索引的问题。