在上一篇博客中,我们解决了逻辑删除的诸多问题,思路是把唯一约束字段与is_delete组合成一起,变成一个唯一约束,在每次修改时把is_delete = id,这样就能保证重复删除。但是在后面编写代码时发现,把删除标记字段修改成id,在批量删除的时候,sql语句十分的难写,本人没写出来。所以开始找解决办法。
通过搜索资料得知,把两个字段联合成唯一索引时,只要其中一个值为null,那个这条数据的唯一索引就会失效,顿时恍然大悟,于是把代码进行了进一步的修改。
`is_delete` int DEFAULT '0' COMMENT '删除标记,默认值0,0表示未删除,null表示已删除',
UNIQUE KEY `username` (`username`,`is_delete`) USING BTREE
在每次删除的时候,不是把is_delete字段改为id,而是置为null,这样就完美解决了批量删除sql语句复杂问题。
最后附上批量删除sql语句
<!--删除-->
<delete id="deleteByIds">
update emp set is_delete = null where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>