如果第三列为真,则确保两列的唯一性

Insure uniqueness of two columns if a third is true

| row (int)     | thingy_a_id (int)     | thingy_b_id (int)     | bool  | bunch_more_cols   |
|-----------    |-------------------    |-------------------    |------ |-----------------  |
| 1             | 6                     | 2                     | 0     |                   |
| 2             | 3                     | 3                     | 0     |                   |
| 3             | 2                     | 4                     | 0     |                   |
| 4             | 2                     | 4                     | 0     |                   |
| 5             | 2                     | 4                     | 1     |                   |
| 6             | 6                     | 2                     | 0     |                   |

在我正在创建的数据库中,我需要两列的组合才能唯一,但前提是第三列为真。因此,在上面的示例中,第 3 行和第 4 行具有相同的 a 和 b 列是可以的,因为 bool 为 False (0)。而且第 5 行与第 3 行和第 4 行具有相同的 a 和 b 列也是可以的,因为它是唯一一个 bool 为真的行 (1)。而且,如果在 thingy_a_id 为 2,thingy_b_id 为 4 AND bool 为 False (0) 的地方提交另一行,那就没问题了。

我需要防止提交另一行,其中 thingy_a_id 是 2,thingy_b_id 是 4 AND bool 是 True (1)。

可以用 mySql 完成吗?我怎样才能做到这一点?

就目前而言,MySQL 不支持部分唯一索引(与其他数据库如 Postgres 不同)。

解决此问题的一种方法是将 bool 列中的 0 替换为 nulls:如 explained in the documentationa UNIQUE 索引允许可以包含 NULL.

的列有多个 NULL

所以你首先要确保该列被声明为nullable,然后将所有0s变成null:

update mytable set bool = null where bool = 0;

然后就可以创建唯一索引了:

create unique index mytable_idx on mytable(thingy_a_id, thingy_b_id, bool);

有了这个设置,您可以放心,当 bool 具有值 1 时,(thingy_a_id, thingy_b_id) 上不会发生重复,并且当 boolnull.