我的数据库中有用户表。
用户具有字段名称,company_id和status:boolean,1- live,0- deleted。
删除用户后,其状态将设置为0.
公司中实时用户名的组合应该是唯一的。删除用户后,我不介意为公司创建具有相同名称的用户。
我的问题是我如何为字段名称,company_id和 status = 1 定义uniuqe约束(这不是对这三个字段的限制因为我不介意组合name-company_id-0将在表格中出现几次。
谢谢,
德沃拉
答案 0 :(得分:3)
对已删除的用户使用NULL值 唯一键允许无限数量的NULL值。
更新:不要触摸用户名,状态字段中的NULL就足够了。
答案 1 :(得分:1)
您使用的是哪种编程语言?
你的逻辑应该如下
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.
答案 2 :(得分:0)
我会创建另一个列来存储已删除用户的先前名称,并在删除它们时将其真实姓名设置为NULL(以及将状态设置为0)。
然后对名称和公司有一个独特的约束。 NULL不会影响唯一性(因为NULL != NULL
),如果需要,您仍然可以恢复用户的原始名称。
所以删除操作类似于:
update users
set prev_name = name,
name = null,
status = 0
where name = 'paxdiablo' and company = 'SmallGreen';
答案 3 :(得分:0)
如果将“实时”和“删除”分开以便它们有自己的tinyint / boolean列会更容易吗?
答案 4 :(得分:-1)
我会用deleted_at(datetime)替换status字段。当用户处于活动状态时,其值将为NULL,但删除后,将设置为当前日期时间。
接下来,我会在用户名和附加信息上添加唯一索引deleted_at字段,这将允许我删除具有相同用户名的多个用户(至少间隔1秒)。