Mysql 如果第三列为真,则确保两列的唯一性
在我正在创建的数据库中,我需要两列的组合是唯一的,但只有当第三列为真时。在上面的例子中,第3行和第4行的a和b列是相同的,因为bool是False(0)。第5行的a&b cols与第3&4行的a&b cols相同,这也没关系,因为这是唯一一个bool是真的(1)。并且,如果提交了另一行,其中thingy_a_id为2,thingy_b_id为4,bool为False(0),那么就可以了 我需要防止的是发生另一行,其中thingy_a_id为2,thingy_b_id为4,bool为True(1)Mysql 如果第三列为真,则确保两列的唯一性,mysql,sql,unique-constraint,Mysql,Sql,Unique Constraint,在我正在创建的数据库中,我需要两列的组合是唯一的,但只有当第三列为真时。在上面的例子中,第3行和第4行的a和b列是相同的,因为bool是False(0)。第5行的a&b cols与第3&4行的a&b cols相同,这也没关系,因为这是唯一一个bool是真的(1)。并且,如果提交了另一行,其中thingy_a_id为2,thingy_b_id为4,bool为False(0),那么就可以了 我需要防止的是发生另一行,其中thingy_a_id为2,thingy_b_id为4,bool为True(1)
这可以通过mySql实现吗?我怎样才能做到这一点呢?就目前而言,MySQL不支持部分唯一索引(与其他数据库如Postgres不同) 解决此问题的一种方法是将
bool
列中的0
替换为null
s:as,UNIQUE
索引允许对可以包含null
的列使用多个null
值
因此,您首先要确保该列声明为null
able,并将所有0
s转换为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 | |
然后可以创建唯一索引:
update mytable set bool = null where bool = 0;
有了这个设置,您可以放心,当
bool
有值1
时,不会在(thingy\u a\u id,thingy\u b\u id)
上发生重复,并且当bool
为null
时允许重复。非常感谢,这正是我需要的!是的,这里的关键是关于“部分索引”。不幸的是,MySQL没有实现它们+你是一位绅士和学者!我已经确认这在我的代码中按预期工作。必须设置NULL而不是0有点奇怪。但是,它起作用了!非常感谢!在MySQL 8.13+中,您可以保留bool=0
,并定义一个功能独特的键,如Thank you@PaulSpiegel!MySql 8对我来说有点新鲜。我现在可能要推出一个兼容5.7的解决方案。但是,这真是个好消息,谢谢!
create unique index mytable_idx on mytable(thingy_a_id, thingy_b_id, bool);