2010-07-21 114 views
4

我在我的数据库中有用户表。条件MYSQL的唯一约束条件

用户具有字段name,company_id和status:布尔值,1-实时,0-删除。

当用户被删除,他的状态设置为0。

实时用户名在公司的组合应该是唯一的。删除用户后,我不介意为用户创建同名的公司。

我的问题是我怎么定义uniuqe限制为字段名称,COMPANY_ID和状态= 1(这不是一个uniuqe限制在这三个领域监守我不介意的组合名称company_id- 0会在表格中出现几次)。

感谢,

德沃拉

回答

3

删除用户的使用NULL值。
唯一键允许无限数量的NULL值。

更新:不要触摸用户名,NULL在状态字段就足够了。

+0

面对NULL意图的苍蝇排列(未知或不适用),但它是实用的(我是所有的实用主义)。 – paxdiablo 2010-07-26 06:10:02

1

您正在使用哪种编程语言?

你的逻辑shoule如下

select * from Table_name where name='' AND company_id = '' AND status = 1 

if this return any rows give uniqueness error to the user else create it. 
0

我会创造另一个列来存储已删除用户的以前的名字,当他们删除设置自己的真实姓名为NULL(以及设置状态到0)。

然后对名称和公司有一个唯一的限制。 NULL不会影响唯一性(因为NULL != NULL),如果需要,您仍然可以恢复用户的原始名称。

所以删除操作是一样的东西:

update users 
    set prev_name = name, 
     name = null, 
     status = 0 
where name = 'paxdiablo' and company = 'SmallGreen'; 
+0

谢谢大家! – Dvora 2010-07-26 05:46:11

0

它会更容易,如果你拆“活”和“删除”,让他们有自己的TINYINT /布尔列?

-1

我会用deleted_at(datetime)替换状态字段。当用户处于活动状态时,其值将为NULL,但在删除时将设置为当前日期时间。

接下来,我将在用户名& deleted_at字段上添加唯一索引,这将允许我使用相同的用户名(至少1秒间隔)删除多个用户。