Using triggers and constraints to limit the number of records in MySQL
P粉807397973
P粉807397973 2023-11-14 13:35:02
0
4
1002

I have a table called BFFs that stores user IDs and best friends' user IDs, and I want to limit the table to 3 best friends for each different user.

I mean if the table structure is:

BFFs(userID, userID)

The record is:

(3286, 1212)
(3286, 4545)
(3286, 7878)

In this case, the user with ID 3286 should not be allowed to have new records, for example (3286, xyzt).

I wrote this trigger but I'm not sure:

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;
/

How should I re-enrich it on the relational table via assertions or triggers?

Thanks

P粉807397973
P粉807397973

reply all(5)
P粉113938880

In addition to hypercubes' answer (which leverages DRI to enforce your rules), you can also do a LEFT JOIN with MIN to get the next of 1, 2 or 3 from the three tables for each user ID one

徐涛

Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa

徐涛

Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa Sofa

P粉769413355

Add another column, FriendNumber, and a foreign key constraint to the reference table containing exactly 3 rows:

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
) ;

Then you can add:

INSERT INTO BFFs 
  (userID, friendID, friendNumber)
VALUES
  (3286, 1212, 1) ,
  (3286, 4545, 2) ,
  (3286, 7878, 3) ;

Or as @gbn suggested, like this (so the column is autofilled):

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 abides by the law and sends a message Asafa abides by the law and sends a message Asafa abides by the law and sends a message Asafa abides by the law and sends a message

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template