这是我的玩具设置。我有 3 张桌子。一张桌子是客人名单(姓氏、名字等)、食物名单(豆类、糊状物、米饭、蔬菜)和订单名单(客人 ID、食物 ID)。订单清单是我感兴趣的。我想将其限制为以下条件。
客人必须有 3 个订单。客人可以有一个空订单。每个客人的订单不能相同,除非订单为空。
因此订单表如下所示(使用字符串而不是 fk id):
steve, beans
steve, rice
steve, veggies
joey, rice
joey, beans
joey, <null>
sarah, rice
sarah, <null>
sarah, <null>
sam, <null>
sam, <null>
sam, <null>
显然山姆不喜欢食物……但那将是一张有效的桌子。每个用户都有 3 个条目,并且没有用户有重复项(你没有双 bean!)。
我尝试过的事情
create table order (
guest_uid FK,
food_uid FK,
CONSTRAINT order_unique UNIQUE (guest_uid, food_uid)
)
这适用于验证没有双 bean,但双/三空不会飞。我希望 oracle 唯一的 null 可以在这里应用,但我猜不是(违反了唯一约束 order_unique)。
我尝试了其他一些检查约束,但我无法找到一种方法来指定跨行的唯一性而不执行子查询(当然,这是不允许的)。有什么想法吗?谢谢
附言。如果唯一有效的答案是“使用 PL/SQL 或触发器”,我会确保将其标记为正确答案。