使用mysql组合key去设置唯一索引unique时,可以避免因各种原因导致的重复脏数据问题,但由于我们绝大多数表都不建议采取物理删除的方式去对待可爱的数据们,因此我们常常使用逻辑删除(软删除)的方式去对错误数据或无效数据进行删除,以便后续追溯及误删除的还原。
现在在使用laravel这一框架后,默认使用的逻辑删除字段为deleted_at,默认为null,删除后为删除时间。而mysql的unique,如果某个在其中的字段为null,其他字段相同,是允许加入的,就导致了用deleted_at作为unique的其中一个字段时,会出现乌龙现象,导致正常存在的数据无法保证唯一,被删除的数据才能根据不同删除时间去保证唯一。
所以原则上不建议直接将deleted_at字段去用做unique的字段组成部分
建议还是用自定义字段去作为unique的组成,且组合的字段集成员都不能允许为null。
比如设置一个int类型的字段,未删除则用0表示,删除的话,则填入删除时的时间戳。(但是这种方式需要做一些处理,在进行删除时额外变更该字段,具体可以百度搜索,这里就不过多赘述了)