【问题标题】:MySQL unique constraint of two columns only if second column is a specific value仅当第二列是特定值时,两列的 MySQL 唯一约束
【发布时间】:2017-10-27 00:10:45
【问题描述】:

您好,我有一个 Mysql 表,我在其中保存客户端

在一栏中我保存了 IP 地址,

在我设置的其他列中客户端是否处于活动状态 我还保存了姓名、邮件等...

如果有一个客户离开,我们只需将 Active 列设置为 0,(以保留付款历史等),当新客户到达时,我们可以重新分配相同的 IP

有没有办法创建一个 UNIQUE 约束以只允许一个处于活动状态的 IP?

例子

IP    |   ACTIVE  |   DATE
---------------------------------
102   |      1    |    2017-10-12
103   |      1    |    2017-10-12
103   |      0    |    2017-10-13
103   |      0    |    2017-10-09

所以它可以是多行,IP和0,但只有一个IP和1

我正在考虑在 INSERT、UPDATE 之前执行 SELECT 并验证是否没有其他行具有该 IP 和 ACTIVE 中的 1

建议?

【问题讨论】:

  • IP 地址不是唯一的
  • @MichelFeldheim 如果 OP 想要强制每个 IP 地址只允许一个活动用户,那么它将是唯一的。但是,我同意在现实世界中,这种情况不太可能发生。

标签: mysql triggers constraints unique


【解决方案1】:

备选方案 1

不使用0 表示不活动,为什么不使用负数呢?这样,您可以在 IP / Active 列对上保持唯一性,并且只有带有 Active = 1 的记录才会被认为是活动的。我不确定您的停用逻辑是什么,但基本上,您只会选择一个比现有负数小一的负数(或-1,如果它是第一个)来更新记录。

备选方案 2

完全放弃Active 列,并创建另一个表来保存IP 历史记录。所以......在你的主表中,唯一性约束是在 IP 地址上。在您的历史记录表中,您可以对 IP 地址及其成为历史记录的日期进行唯一性约束。

编辑

根据@MichelFeldheim 的评论,我建议您将用户电子邮件地址作为唯一性约束的一部分。基本上意味着每个唯一用户将被允许一个活动 IP 地址。它还将允许每个 IP 地址(或组织,例如)有多个活动用户。

【讨论】:

    【解决方案2】:

    使用值1 和NULL 而不是1 和0。

    然后您可以将UNIQUE KEY (ip, active) 添加到表中,并且每个IP 组合只允许一个值为1 的行,但NULL 的无限行不会违反唯一约束。

    请记住,NULL = NULL不是为真,因为NULL不是一个值。它是表示没有值的标记。两个不存在的值不能说是相同的,因此NULL 的多个行与ip 的相同值不会被视为重复,因此它们不能违反唯一约束。

    旁白:注意到NULL = NULL 不是真的,如上所述,同样重要的是要注意,它也不是假的。同样,NULL != NULL 既不是真也不是假,因为——根据定义——缺少值不能与任何东西进行适当的比较,包括另一个缺少值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多