我有一个名为 BFFs 的表,用于存储用户 ID 和最好朋友的用户 ID,我想限制该表为每个不同的用户提供 3 个最好的朋友。
我的意思是如果表结构是:
BFFs(userID, userID)
记录是:
(3286, 1212) (3286, 4545) (3286, 7878)
在这种情况下,如果 ID 为 3286 的用户不应被允许拥有新记录,例如 (3286, xyzt)。
我写了这个触发器,但我不确定:
CREATE TRIGGER BFFControl BEFORE INSERT ON BFFs FOR EACH ROW DECLARE numberOfBFFs INTEGER; max_BFFs INTEGER := 3; BEGIN SELECT COUNT(*) INTO numberOfBFFs FROM BFFs WHERE sender =: NEW.sender IF :OLD.sender =: NEW.sender THEN RETURN; ELSE IF numberOfBFFs >= max_BFFs THEN RAISE_APPLICATION_ERROR(-20000, 'Users are allowed to have at most thre friends.'); END IF; END IF; END; /
我应该如何通过断言或触发器在关系表上重新丰富它?
谢谢
除了 ypercubes 的答案(其中利用 DRI 来强制执行您的规则)之外,您还可以使用 MIN 进行 LEFT JOIN,以从每个用户 ID 的三个表中获取 1、2 或 3 中的下一个
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
向恰好包含 3 行的引用表添加另一列、
FriendNumber
和外键约束:然后您可以添加:
或者按照@gbn的建议,像这样(所以该列是自动填充的):
阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒