如何在两列中使行的值唯一?

时间:2014-08-16 23:22:39

标签: sql postgresql

假设我有两列,列A和列B.列A是必需的,列B是可选的。如果指定了B列,我想确保在其自己的行之外的B列(简单)或A列(看起来更难)中找不到它的值。同样,如果更改了A列,我想确保在其自己的行之外的B列或A列中找不到新值。

到目前为止,我得到的最接近的是排除约束,但似乎无法将B列与A列进行比较。这可能在应用层之外,还是我坚持使用应用层解决方案?

用例是我想要以下内容:

  1. 用户始终拥有用户名,这些用户名在所有用户名和电子邮件中始终是唯一的。
  2. 用户有时会收到电子邮件,这些邮件在所有用户名和电子邮件中都是唯一的。
  3. 这让我知道,例如,如果用户使用他们的电子邮件地址登录,我知道他们的用户名是什么。但我也希望用户能够使用电子邮件地址作为用户名。更令人困惑的是,我希望用户能够将一个电子邮件地址指定为用户名,并将单独的电子邮件地址指定为存档的电子邮件地址。

    任何指针?

1 个答案:

答案 0 :(得分:2)

我认为你应该有users的一个表。这应该具有唯一的,自动递增的用户ID。您应该有另一个logins表。这将有如下列:

  • 用户ID
  • LoginType(电子邮件或用户ID)
  • 名称

此表在name上有唯一约束。此外,它对UserId和LoginType具有唯一约束,以确保任何给定用户的每个最多一个值。例如,您可以添加其他约束以确保电子邮件看起来像电子邮件。

如果您想要一个与UserId相关联的单独电子邮件用于联系目的,您可以将其放在Users表中。

关键想法:将登录的混乱概念移到数据库中的单独实体(表)。