2016-06-08 48 views
0

我有两个列的表,我想打的唯一只有columng is_deleted值为0 email列,所以下面行是有效的,如果[email protected]1进入它将使其中,如果[email protected]0进入它不应该让。如何在MySQL中做这个约束?如何在一个表中使值为0/1的mysql具有唯一性?

email   is_deleted 
[email protected] 1 
[email protected] 1 
[email protected] 1 
[email protected] 0 

我试图做出独特的两列,它允许一个条目,但它在此之后失败。

[email protected] 1 
[email protected] 0 

我正在使用唯一字段进行软删除。

感谢您的帮助。

回答

2

这实际上是我在一段时间内在堆栈溢出中看到的更好的问题之一。根据我的理解,这本身是不可能的,至少没有做一些有创意的事情。

我能想象使其工作的唯一方法是创建一个额外的字段,它可以包含IS_DELETED == 1的任意随机IFF,并利用对所有3

因此,该表中的唯一关键可能是这个样子:

email   is_deleted null_ident 
[email protected] 1   0cc175b9c0f1b6a831c399e269772661 
[email protected] 1   92eb5ffee6ae2fec3ad71c777531578f 
[email protected] 1   4a8a08f09d37b73795649038408b5f33 
[email protected] 0   0 

因此,对所有这3唯一的密钥IS_DELETED时将只会是0和null_ident也为0(通过业务逻辑处理)。如果您需要针对地址设置is_deleted,则还需要设置ident键。


此外,在上面的示例中,null_ident只是一个可用于一般可接受的唯一性的md5散列。根据你的需要,你可能想要一个更强大的(或者更可能是不太强大的)散列。哎呀,时间戳可能会适合您的需要罚款。索引中的char(36)有点沉重......但电子邮件地址的varchar(310)也是如此。 :)

相关问题