mysql防止多个字段的冗余记录

时间:2012-05-28 05:11:14

标签: mysql duplicates

我在这里遇到了问题。我有一个以下架构的表:

id : int(11) not null primary key
name : varchar(255) not null
status : enum('ACTIVE','DELETED')

注意:记录被“软删除”,我们只是将状态标记为“DELETED”。

问题是我不希望一个家伙能够通过2个不同的线程创建相同名称(冗余)的条目,除非db中的现有记录处于'DELETED'状态。有什么可能的方法来做到这一点?

我不能将唯一索引名称+状态,因为如果我们在'DELETED'中有一个项目(具有相同名称),并且我想要删除的区域是'ACTIVE',则会发生错误,因为我标记该区域将被“删除”。

2 个答案:

答案 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,请检查您的语言。