Utiliser des déclencheurs et des contraintes pour limiter le nombre d'enregistrements dans MySQL
P粉807397973
P粉807397973 2023-11-14 13:35:02
0
4
1005

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粉807397973
P粉807397973

répondre à tous(5)
P粉113938880

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

徐涛

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é

徐涛

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粉769413355

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
徐涛

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal