我有一个名为 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;
/
我应该如何通过断言或触发器在关系表上重新丰富它?
谢谢
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
除了 ypercubes 的答案(其中利用 DRI 来强制执行您的规则)之外,您还可以使用 MIN 进行 LEFT JOIN,以从每个用户 ID 的三个表中获取 1、2 或 3 中的下一个
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
向恰好包含 3 行的引用表添加另一列、
FriendNumber和外键约束:CREATE TABLE Three ( friendNumber TINYINT NOT NULL , PRIMARY KEY (friendNumber) ) ; INSERT INTO Three(friendNumber) VALUES (1), (2), (3) ; CREATE TABLE BFFs ( userID INT NOT NULL , friendID INT NOT NULL , friendNumber TINYINT NOT NULL , PRIMARY KEY (userID, friendID) , UNIQUE (userID, friendNumber) , FOREIGN KEY userID REFERENCES Person(userID) , FOREIGN KEY friendID REFERENCES Person(userID) , FOREIGN KEY friendNumber --- this ensures that a user can have REFERENCES Three(friendNumber) --- max of 3 friends ) ;然后您可以添加:
或者按照@gbn的建议,像这样(所以该列是自动填充的):
INSERT INTO BFFs (userID, friendID, friendNumber) SELECT 3286 AS userID , 8989 AS friendID , COALESCE( ( SELECT MIN(Three.friendNumber) FROM Three LEFT JOIN BFFs AS b ON b.friendNumber = Three.friendNumber AND b.userID = 3286 WHERE b.friendNumber IS NULL ), 4 ) AS friendNumber FROM dual阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒