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

多数情况下,如果一张表字段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;

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

你可能感兴趣的:(当逻辑删除遇上联合唯一索引)