Heim  >  Fragen und Antworten  >  Hauptteil

Verwenden von Triggern und Einschränkungen, um die Anzahl der Datensätze in MySQL zu begrenzen

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粉807397973P粉807397973340 Tage vor978

Antworte allen(4)Ich werde antworten

  • P粉113938880

    P粉1139388802023-11-15 12:52:39

    除了 ypercubes 的答案(其中利用 DRI 来强制执行您的规则)之外,您还可以使用 MIN 进行 LEFT JOIN,以从每个用户 ID 的三个表中获取 1、2 或 3 中的下一个

    Antwort
    0
  • 徐涛

    徐涛2023-11-15 17:38:31

    沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发

    Antwort
    0
  • 徐涛

    徐涛2023-11-15 17:42:09

    沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发沙发

    Antwort
    0
  • P粉769413355

    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

    Antwort
    0
  • 徐涛

    徐涛2023-11-15 17:36:28

    阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒阿萨法守法发撒

    Antwort
    0
  • StornierenAntwort