我可以有条件地执行唯一性约束吗?

use*_*862 19 mysql unique-constraint

我的数据库包含一个用户表.每个活跃用户都有唯一的用户名.我希望能够停用用户并释放他们正在使用的用户名,但将它们保存在同一个表中.

有没有办法只有条件地强制执行唯一性约束?

Gor*_*off 45

添加另一个名为的列isactive.创建一个独特的约束(username, isactive).

然后,您可以同时拥有活动和非活动用户名.您将无法拥有两个活动用户名.

如果需要多个非活动名称,请使用NULLisactive. NULL值可以在唯一索引中重复.

  • 该计划的问题在于,如果用户名的第二个用户变得不活动,则会违反唯一性约束。 (4认同)
  • 如果曾经选择答案,那么应该是这个答案,以便实际回答所提出的问题。 (2认同)

spe*_*593 8

不,UNIQUE约束不能是"有条件的".

一种选择是将username列设置为NULL.UNIQUE约束将允许多行具有NULL值.

您可以将其转换为您想要显示的任何字符串.无论是在应用程序中,还是在SQL中

SELECT IFNULL(t.username,'USER DELETED') AS username
  FROM mytable t
Run Code Online (Sandbox Code Playgroud)

如果要保留这些行以用于历史/存档目的,则可能不希望更新该username列.(如果更改username列的值,则允许后续语句插入与先前用户名具有相同值的行.)

您可以在表中添加一个附加列,以表示"用户已删除"条件.例如:

user_deleted TINYINT(1) UNSIGNED DEFAULT 0 COMMENT 'boolean' 
Run Code Online (Sandbox Code Playgroud)

您可以检查此列,并'USER DELETED'user_deleted设置布尔值时返回常量来代替username列:

SELECT IF(u.user_deleted,'USER DELETED',u.username) AS username
Run Code Online (Sandbox Code Playgroud)

(使用值1表示逻辑"用户删除"条件.)

这种方法的最大优点是username不必修改列,username值和UNIQUE约束将阻止插入具有重复用户名的新行.


Rog*_*ger 0

不,如果有唯一索引(因此得名),则不能有重复项。添加额外的列以使每条记录都唯一。或者更改该值使其唯一。

不推荐,但例如您可以添加时间戳“USER DELETED 2013/08/17:233805”