Maison  >  Questions et réponses  >  le corps du texte

Utiliser des déclencheurs et des contraintes pour limiter le nombre d'enregistrements dans MySQL

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粉807397973P粉807397973340 Il y a quelques jours975

répondre à tous(4)je répondrai

  • P粉113938880

    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

    répondre
    0
  • 徐涛

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

    répondre
    0
  • 徐涛

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

    répondre
    0
  • P粉769413355

    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

    répondre
    0
  • 徐涛

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

    répondre
    0
  • Annulerrépondre