id : int(11) not null primary key
name : varchar(255) not null
status : enum('ACTIVE','DELETED')
注意:记录被“软删除”,我们只是将状态标记为“DELETED”。
问题是我不希望一个家伙能够通过2个不同的线程创建相同名称(冗余)的条目,除非db中的现有记录处于'DELETED'状态。有什么可能的方法来做到这一点?
我不能将唯一索引名称+状态,因为如果我们在'DELETED'中有一个项目(具有相同名称),并且我想要删除的区域是'ACTIVE',则会发生错误,因为我标记该区域将被“删除”。
答案 0 :(得分:3)
如何在您的数据中添加deleted_at字段?然后,您可以在名称+状态+ deleted_at上拥有唯一键。当status = ACTIVE时,deleted_at只能有一个值,因此这将使唯一性仅在名称上。
为清晰起见,编辑:
CREATE TABLE mytable (
id int not null primary key,
name varchar(255) not null,
status enum('active','delete'),
deleted_at datetime not null default 0,
UNIQUE KEY one_active (name, status, deleted_at)
);
编辑#2 :实际上,如果您进行“检查是否已删除”代码,请检查deleted_at> 0而不是检查status = deleted,然后你甚至不需要状态字段。
答案 1 :(得分:0)
您应该以编程方式实现目标。如果存在名称+状态ACTIVE以限制INSERT,请检查您的语言。