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)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律