我的表架构是:
r(int aID not null, int bID not null, bool main)
主键(aId,bID)。 aID和bID都是外键(指不同的表)。
我想对每个aID强制执行,只有一个和一个bID也是main = true。
如何在db级别中执行此操作?
我可以通过添加constraint 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
...
答案 0 :(得分:0)
您应该创建两个触发器。它们都适用于每一行。第一个将在插入之前适用,第二个将在更新之前适用。如果main = true并且表中至少有一行具有与new.aID相同的aID但具有不同的bID,同样使用main = true,则设置new.main = false。
您可以在大多数RDBMS中的单个触发器中执行此操作,但MySQL不支持(如果我没有记错)触发器适用于插入和更新。