Maison > Questions et réponses > le corps du texte
J'ai une table appelée BFFs qui stocke les identifiants d'utilisateur et les identifiants d'utilisateur des meilleurs amis, et je souhaite limiter la table à 3 meilleurs amis pour chaque utilisateur différent.
Je veux dire si la structure de la table est :
BFFs(userID, userID)
Le record est :
(3286, 1212) (3286, 4545) (3286, 7878)
Dans ce cas, l'utilisateur avec l'ID 3286 ne doit pas être autorisé à avoir de nouveaux enregistrements, par exemple (3286, xyzt).
J'ai écrit ce déclencheur mais je ne suis pas sûr :
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; /
Comment le ré-enrichir sur la table relationnelle via des assertions ou des triggers ?
Merci
P粉1139388802023-11-15 12:52:39
En plus de la réponse d'ypercubes (qui exploite DRI pour appliquer vos règles), vous pouvez également effectuer un LEFT JOIN en utilisant MIN pour obtenir le prochain de 1, 2 ou 3 des trois tables par ID utilisateur
徐涛2023-11-15 17:38:31
Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé
徐涛2023-11-15 17:42:09
Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé Canapé
P粉7694133552023-11-15 00:32:43
Ajoutez une autre colonne, FriendNumber
et une contrainte de clé étrangère à la table de référence contenant exactement 3 lignes :
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 ) ;
Ensuite, vous pouvez ajouter :
INSERT INTO BFFs (userID, friendID, friendNumber) VALUES (3286, 1212, 1) , (3286, 4545, 2) , (3286, 7878, 3) ;
Ou comme @gbn l'a suggéré, comme ceci (pour que la colonne soit remplie automatiquement) :
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
徐涛2023-11-15 17:36:28
Asafa respecte la loi et envoie un message Asafa respecte la loi et envoie un message Asafa respecte la loi et envoie un message Asafa respecte la loi et envoie un message