多数情况下,如果一张表字段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;
这样就可以处理好逻辑删除和联合唯一索引多次删除的问题了。
网友评论