Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果第三列为真,则确保两列的唯一性_Mysql_Sql_Unique Constraint - Fatal编程技术网

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

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)

在我正在创建的数据库中,我需要两列的组合是唯一的,但只有当第三列为真时。在上面的例子中,第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);