[英]Limit number of records using trigger and constraints in MySQL
我有一个名为BFF的表,该表存储userID和最好的朋友的userID,并且我希望限制该表为每个不同的用户恰好有3个最好的朋友。
我的意思是表structre是:
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;
/
我该如何通过断言或触发器在关系表上重新实现呢?
谢谢
将另一列FriendNumber
和外键约束添加到具有3行的引用表中:
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
) ;
然后,您可以添加:
INSERT INTO BFFs
(userID, friendID, friendNumber)
VALUES
(3286, 1212, 1) ,
(3286, 4545, 2) ,
(3286, 7878, 3) ;
或如@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
除了ypercubes的答案(使用DRI实施规则)之外,您还可以使用MIN左移JOIN以从每个用户ID的“三”表中获取下一个1、2或3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.