如何使 mysql 中的两列在一个 table 中唯一且值为 0/1?

How to make two column unique in mysql with value 0/1 in one table?

我有一个包含这两列的 table,我想仅当电子邮件列的列 is_deleted 值为 0 时才具有唯一性,因此如果 abc@gmail.com 具有以下行则有效1 允许输入,如果 abc@gmail.com0 不允许输入。如何在mysql中做这个约束?

email           is_deleted
abc@gmail.com   1
abc@gmail.com   1
abc@gmail.com   1
abc@gmail.com   0

我试图让两列都独一无二,它允许一个条目,但在此之后它失败了。

abc@gmail.com   1
abc@gmail.com   0

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

感谢您的帮助。

这实际上是我一段时间以来在 Stack Overflow 上看到的更好的问题之一。据我所知,这本身是不可能的,至少在不做一些有创意的事情的情况下是不可能的。

我能想到的让它工作的唯一方法是创建一个可以包含任意随机 IFF is_deleted == 1 的额外字段,并对所有 3 使用唯一密钥。

因此,table 可能看起来像这样:

email           is_deleted  null_ident
abc@gmail.com   1           0cc175b9c0f1b6a831c399e269772661
abc@gmail.com   1           92eb5ffee6ae2fec3ad71c777531578f
abc@gmail.com   1           4a8a08f09d37b73795649038408b5f33
abc@gmail.com   0           0

因此,只有当 is_deleted 为 0 且 null_ident 也为 0(通过业务逻辑处理)时,针对所有这 3 个的唯一密钥才会锁定。如果您需要针对地址设置 is_deleted,您还需要设置一个身份密钥。


此外,还有一个补充……在上面的示例中,null_ident 只是一个 md5 散列,通常用于接受 table 唯一性。根据您的需要,您可能需要更强(或者更可能是不太强)的散列。哎呀,时间戳可能会很好地满足您的需求。索引中的 char(36) 有点重……但是电子邮件地址的 varchar(310) 也是如此。 :)