2

我这里有问题。我有以下架构的表:

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

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

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

我不能只对名称+状态进行唯一索引,因为如果我们在“已删除”中有一个项目(同名),并且我想要删除的区域是“活动”,那么当我将该区域标记为时会发生错误被“删除”。

4

2 回答 2

3

用你的数据添加一个 deleted_at 字段怎么样?然后你可以在 name + status + 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,那么你甚至不需要状态字段。

于 2012-05-28T05:31:19.463 回答
0

您应该以编程方式实现您的目标。如果存在名称 + 状态 ACTIVE 以限制 INSERT,请检查您的语言。

于 2012-05-28T05:19:44.727 回答