Mysql SQL:强制执行至少一个&&;每把钥匙最多一把

Mysql SQL:强制执行至少一个&&;每把钥匙最多一把,mysql,constraints,conditional-statements,minimum,Mysql,Constraints,Conditional Statements,Minimum,我的表架构是: r(int aID not null, int bID not null, bool main) 主键(aId、bID)。aID和bID都是外键(参考不同的表) 我想强调的是,对于每一个援助,总是有一个和一个唯一的出价,这也是主=真的 我怎样才能在db级别做到这一点? 我可以通过添加一个约束unique(aID,main)来强制“max 1”,main要么为true,要么为NULL “至少1”部分如何 PS:在MySQL上工作 编辑:用于澄清的示例数据: 您可以有各种aID和

我的表架构是:

 r(int aID not null, int bID not null, bool main)
主键(aId、bID)。aID和bID都是外键(参考不同的表)

我想强调的是,对于每一个援助,总是有一个和一个唯一的出价,这也是主=真的

我怎样才能在db级别做到这一点? 我可以通过添加一个
约束unique(aID,main)
来强制“max 1”,main要么为true,要么为NULL

“至少1”部分如何

PS:在MySQL上工作

编辑:用于澄清的示例数据: 您可以有各种aID和bID组合,但对于每个aID,只有一个组合的main=true。 演示数据:

 1, 2, true
 1, 3, NULL
 1, 4, NULL
 1, 5, true <- wrong, only one main=true
 ...
1,2,真
1,3,NULL
1,4,NULL

1,5,true您应该创建两个触发器。它们都适用于每一行。第一个在插入之前适用,第二个在更新之前适用。如果main=true,并且表中至少有一行的aID与new.aID相同,但bID不同,且main=true,则将new.main=false设置


在大多数RDBMS中,您可以在单个触发器中执行此操作,但MySQL不支持(如果我没有弄错的话)同时适用于insert和update的触发器。

也许我没有正确解释,请参阅更新的原始帖子。非常感谢。我明白,我会编辑我的答案,它的第二个版本会更有帮助,至少我希望如此。