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)。

posted @   大唐冠军侯  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示