gpt4 book ai didi

mysql - MySQL中使用触发器和约束限制记录数

转载 作者:行者123 更新时间:2023-11-29 06:09:55 26 4
gpt4 key购买 nike

我有一个名为 BFFs 的表,用于存储用户 ID 和最好 friend 的用户 ID,我想限制该表为每个不同的用户提供 3 个最好的 friend 。

我的意思是如果表结构是:

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;
/

我应该如何通过断言或触发器在关系表上重新丰富它?

谢谢

最佳答案

向恰好包含 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
) ;

然后您可以添加:

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

关于mysql - MySQL中使用触发器和约束限制记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com