美文网首页
当逻辑删除遇上联合唯一索引

当逻辑删除遇上联合唯一索引

作者: 帮我的鸵鸟盖个章 | 来源:发表于2021-03-25 19:28 被阅读0次

多数情况下,如果一张表字段A被设置成唯一索引后,重复数据不允许添加。这个时候如果有逻辑删除操作,可以将字段A与deleted字段建成联合唯一索引。似乎这样就可以了,然而事情并没有那么简单。

这里deleted字段使用0,1标识未删除与已删除。

创建表。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  `deleted` tinyint(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_user` (`user_name`,`deleted`)
)

这里我们有一条数据,id=1, user_name=张三, deleted=0

我们先进行删除操作,将deleted字段更新为1。

update user set deleted = 1 where id = 1;

然后我们在插入一条数据,user_name=张三

insert user(user_name) values ("张三");

此时插入数据的id=2

然而当我再次进行删除操作时:

update user set deleted = 1 where id = 2;

会发现无法成功进行此操作。因为user_name=张三,deleted=1的数据已经存在了。

这个时候我们该怎么办呢!以前我也不知道怎么办,后来发现一种十分机智的办法。

那就是不用0和1标识deleted字段,使用0和一段时间戳标识删除字段

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  `deleted_at` int(11) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_user` (`username`,`deleted_at`)
)

那么我们在进行逻辑删除的时候,只需要这样做:

update user set deleted = UNIX_TIMESTAMP(CURRENT_TIMESTAMP(3))*1000 where id = 2;

这样就可以处理好逻辑删除和联合唯一索引多次删除的问题了。

相关文章

  • 当逻辑删除遇上联合唯一索引

    多数情况下,如果一张表字段A被设置成唯一索引后,重复数据不允许添加。这个时候如果有逻辑删除操作,可以将字段A与de...

  • day06

    6.7 索引的操作管理 1.添加索引 2.查看索引 3.创建唯一索引 4.创建前缀索引 5.创建联合索引 6.删除...

  • MyBatis Plus实现注解式插入或更新

    场景 在进行数据插入时,需要根据唯一索引(有时是联合索引,联合索引确定唯一一条记录)进行插入数据,当有更新的数据到...

  • 软删除注意细节

    当对象中的某一字段含有唯一索引,并且对象有可能存在软删除业务时,应当建立一个新的唯一索引字段(唯一索引+软删除标识...

  • MySQL--索引

    MySQL索引 查看索引 创建索引 创建唯一索引 创建主键索引 删除索引 删除主键 MySQL视图 创建视图 删除...

  • 又是周二

    通过联合唯一索引来防止同样信息生成多条记录 联合唯一索引 uniqueOne: { type: Sequelize...

  • MYSQL视图 索引 分页查询 SQL语句常见面试题

    MYSQL索引类型 按逻辑来分: 1.主键索引是一种特殊的唯一索引,不允许有空值 创建、删除语句:alter ta...

  • MySQL操作索引

    MySQL操作索引 增加普通索引 增加唯一索引 删除索引

  • 辅助索引种类细分

    单列的辅助索引 联合多列辅助索引(覆盖索引) 唯一索引

  • 自关联,索引,权限

    自关联 当where语句里需要一张表与他自己的其他字段相关联时,就需要使用自关联 索引 唯一索引 删除唯一索引 组...

网友评论

      本文标题:当逻辑删除遇上联合唯一索引

      本文链接:https://www.haomeiwen.com/subject/moprhltx.html