Heim > Fragen und Antworten > Hauptteil
Ich habe eine Tabelle namens „BFFs“, in der Benutzer-IDs und Benutzer-IDs der besten Freunde gespeichert sind, und ich möchte die Tabelle auf drei beste Freunde für jeden einzelnen Benutzer beschränken.
Ich meine, wenn die Tabellenstruktur ist:
BFFs(userID, userID)
Der Rekord ist:
(3286, 1212) (3286, 4545) (3286, 7878)
In diesem Fall sollte der Benutzer mit der ID 3286 keine neuen Datensätze haben dürfen, zum Beispiel (3286, xyzt).
Ich habe diesen Auslöser geschrieben, bin mir aber nicht sicher:
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; /
Wie soll ich es in der relationalen Tabelle über Zusicherungen oder Trigger erneut anreichern?
Danke
P粉1139388802023-11-15 12:52:39
除了 ypercubes 的答案(其中利用 DRI 来强制执行您的规则)之外,您还可以使用 MIN 进行 LEFT JOIN,以从每个用户 ID 的三个表中获取 1、2 或 3 中的下一个
徐涛2023-11-15 17:38:31
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
徐涛2023-11-15 17:42:09
沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发
P粉7694133552023-11-15 00:32:43
向恰好包含 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