MySQL实现逻辑删除条件下的字段唯一
背景
实际业务中大多数的表采用的都是逻辑删除,而许多业务字段比如编码之类的都要求唯一,这个时候不能使用唯一索引来做,因为可能会存在删除再次添加的情况。可以采用生成列(Generated Column)配合唯一索引来实现逻辑删除下的字段唯一。
举例,在表test_generated_column表中,存在业务上要求唯一的字段code,但是这张表是逻辑删除
create table test_generated_column
(
id int auto_increment
primary key,
code varchar(30) not null,
is_deleted int default 0 not null
);
如果直接在code上加唯一索引,那么就会出现,一个旧的数据删除之后,无法再次新增同名数据的问题。
这个时候可以使用生成列(Generated Column)
ALTER TABLE test_generated_column
ADD COLUMN code_not_deleted varchar(30) GENERATED ALWAYS AS (CASE WHEN is_deleted = 0 THEN code END) STORED;
如果记录is_deleted = 0,那么code_not_deleted = code,如果is_deleted = 1,那么code_not_deleted = null,这样配合唯一索引就从数据库层面上保证了code_not_deleted的唯一性,
接下来就是在生成列code_not_deleted上加唯一索引
CREATE UNIQUE INDEX test_generated_column_idx_unique_code_not_deleted ON test_generated_column (code_not_deleted);
尝试插入2条同code的数据(一个删除,一个未删除),正常插入,需求实现
insert into test_generated_column (code, is_deleted) values ('test', 0), ('test', 1);

注意:生成列(Generated Column)在 MySQL 中从 5.7.6 版本开始支持。这个特性允许你在表中添加由其他列计算得出的列,并且可以选择是否将其存储在数据库中(即 STORED 或 VIRTUAL)。

浙公网安备 33010602011771号