【问题标题】:How to make two column unique in mysql with value 0/1 in one table?如何在一个表中使两列在mysql中唯一,值为0/1?
【发布时间】:2016-06-08 07:35:48
【问题描述】:

我有一个包含这两列的表,我只想在电子邮件列的 columng is_deleted 值为 0 时创建唯一性,因此如果 abc@gmail.com1 输入下面的行将允许如果 @ 987654324@ 和 0 输入它不应该允许。如何在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

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

感谢您的帮助。

【问题讨论】:

    标签: mysql database phpmyadmin unique-constraint


    【解决方案1】:

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

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

    因此,表格可能如下所示:

    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,您还需要设置一个 ident 键。


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

    【讨论】:

      猜你喜欢
      • 2021-02-06
      • 2020-10-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多