use*_*862 19 mysql unique-constraint
我的数据库包含一个用户表.每个活跃用户都有唯一的用户名.我希望能够停用用户并释放他们正在使用的用户名,但将它们保存在同一个表中.
有没有办法只有条件地强制执行唯一性约束?
Gor*_*off 45
添加另一个名为的列isactive
.创建一个独特的约束(username, isactive)
.
然后,您可以同时拥有活动和非活动用户名.您将无法拥有两个活动用户名.
如果需要多个非活动名称,请使用NULL
值isactive
. NULL
值可以在唯一索引中重复.
不,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约束将阻止插入具有重复用户名的新行.
不,如果有唯一索引(因此得名),则不能有重复项。添加额外的列以使每条记录都唯一。或者更改该值使其唯一。
不推荐,但例如您可以添加时间戳“USER DELETED 2013/08/17:233805”