我有一个名为 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;
/
我应该如何通过断言或触发器在关系表上重新丰富它?
谢谢
Your Answer
5 个回答
除了 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
) ;
然后您可以添加:
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
Hot Questions
function_exists()无法判定自定义函数
2024-04-29 11:01:01
google 浏览器 手机版显示的怎么实现
2024-04-23 00:22:19
子窗口操作父窗口,输出没反应
2024-04-19 15:37:47
父窗口没有输出
2024-04-18 23:52:34
关于CSS思维导图的课件在哪?
2024-04-16 10:10:18
Hot Tools
vc9-vc14(32+64位)运行库合集(链接在下方)
phpStudy安装所需运行库集合下载
VC9 32位
VC9 32位 phpstudy集成安装环境运行库
php程序员工具箱完整版
程序员工具箱 v1.0 php集成环境
VC11 32位
VC11 32位 phpstudy集成安装环境运行库
SublimeText3汉化版
中文版,非常好用
热门话题
抖音等级价目表1-75
20337
7
20337
7
wifi显示无ip分配
13531
4
13531
4
虚拟手机号接收验证码
11851
4
11851
4
gmail邮箱登陆入口在哪里
8836
17
8836
17
windows安全中心怎么关闭
8420
7
8420
7
热门文章
2025年加密货币市场十大趋势预测:下一个风口在哪里?
2025-11-07
By DDD
币圈土狗项目如何识别?避免归零币的陷阱与风险预警
2025-11-07
By DDD
解决CSS @media 查询优先级与规则覆盖问题的教程
2025-11-07
By DDD
win10字体安装后在软件里找不到怎么办_win10字体安装与识别方法
2025-11-07
By DDD
铁路12306支付失败订单还在吗_铁路12306支付失败订单处理方法
2025-11-07
By DDD





