如果第三列为真,则确保两列的唯一性
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
替换为 null
s:如 explained in the documentation、a UNIQUE
索引允许可以包含 NULL
.
的列有多个 NULL
值
所以你首先要确保该列被声明为null
able,然后将所有0
s变成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)
上不会发生重复,并且当 bool
是 null
.
| 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
替换为 null
s:如 explained in the documentation、a UNIQUE
索引允许可以包含 NULL
.
NULL
值
所以你首先要确保该列被声明为null
able,然后将所有0
s变成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)
上不会发生重复,并且当 bool
是 null
.