利用网站空间做代理,深圳网站制作880,推广网站的作用,销售网络设计案例业务场景
在实际工作当中#xff0c;遇到一个场景#xff0c;就是在用户注册时#xff0c;名字要全局唯一#xff0c;当然#xff0c;我们是可以对用户进行删除的#xff0c;你会怎么去做#xff1f;
分析
一般来说#xff0c;我们可以在用户注册请求时#xff0c…业务场景
在实际工作当中遇到一个场景就是在用户注册时名字要全局唯一当然我们是可以对用户进行删除的你会怎么去做
分析
一般来说我们可以在用户注册请求时进行查库校验看看名字是否已经存在如果存在就抛异常给提示否则就落库。 除此之外还可以直接给数据库字段加唯一索引
UNIQUE KEY name_index (name) USING BTREE当前这种需要根据实际情况分析
如果我们删除用户是物理删除就是直接delete没问题如果我们删除用户是逻辑删除相对于update数据的删除标识为1这时候你怎么建唯一索引 针对第二种情况可能很多人会说把删除标识字段也加到索引里面类似
NIQUE KEY name_index (name,is_deleted) USING BTREE这里会有问题当我们进行相同用户第二次删除之后把id3的数据删除逻辑修改is_deleted1此时就会报错如下图
------------------------
| id | name | is_deleted |
------------------------
| 1 | forlan0 | 0 |
| 2 | forlan1 | 1 |
| 3 | forlan1 | 0 |
------------------------那么针对逻辑删除这种情况怎么处理
解决
1、删除时修改is_deleted主键
UPDATE forlan SET is_deleted id WHERE id 3;
--修改后的数据如下
-------------------------
| id | name | is_deleted |
-------------------------
| 1 | forlan0 | 0 |
| 2 | forlan1 | 2 |
| 3 | forlan1 | 3 |
-------------------------2、删除时修改is_deletednull 这种做法不是会有两条相同的数据下面的情况允许存在
UPDATE forlan SET is_deleted NULL WHERE id 3;
--修改后的数据如下
-------------------------
| id | name | is_deleted |
-------------------------
| 1 | forlan0 | 0 |
| 2 | forlan1 | NULL |
| 3 | forlan1 | NULL |
-------------------------Mysql官方文档的解释 A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. This constraint does not apply to NULL values except for the BDB storage engine. For other engines, a UNIQUE index allows multiple NULL values for columns that can contain NULL. 其实大概意思就是除BDB存储引擎外此约束不适用于NULL值。对于其他引擎UNIQUE索引允许包含NULL的列有多个NULL值 为什么允许这么搞 我的理解是NULL其实就表示未知未知的东西无法进行判断如果NULL对唯一索引起作用那么就会导致只能有1行数据为空我们的业务场景可能需要用NULL去表示未知或不确定的值。 当前还是不太建议使用NULL可能存在一些其它问题比如
数据丢失 阿里巴巴规范里面也说了count(*) 会统计值为 NULL 的行而 count(列名) 不会统计此列为 NULL 值的行 WHERE条件!不会查到NULL的值程序空指针报错比如我们使用SUM(cloumn)如果字段都为NULL最终返回NULL增加查询难度 查询时语法需要使用IS NULL 、IS NOT NULL、IFNULL(cloumn) 而传统的 、!等就不能使用了
3、新建一个字段delete_id删除时修改delete_id主键 正常来说其实1,2种方案已经满足为什么我们要使用这种 假设我们的表已经上线使用了一段时间这时我们需要建唯一索引就可以采取方案实际上就是在删除的时候多更新一个字段
UPDATE forlan SET is_deleted 1,delete_id id WHERE id 3;总结
有3种数据库层面的解决方案
删除时修改is_deleted主键删除时修改is_deletednull新建一个字段delete_id删除时修改delete_id主键
至于怎么选择看业务场景 如果是已经投入使用的业务可以采取方案3否则可以采取方案1。