首頁  >  問答  >  主體

MySQL中使用觸發器和約束限制記錄數

我有一個名為 BFFs 的表,用於儲存使用者 ID 和最好朋友的使用者 ID,我想限制該表為每個不同的使用者提供 3 個最好的朋友。

我的意思是如果表格結構是:

BFFs(userID, userID)

記錄是:

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

在這種情況下,如果 ID 為 3286 的使用者不應被允許擁有新記錄,例如 (3286, xyzt)。

我寫了這個觸發器,但我不確定:

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

我應該如何透過斷言或觸發器在關係表上重新豐富它?

謝謝

P粉807397973P粉807397973340 天前977

全部回覆(4)我來回復

  • P粉113938880

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

    除了ypercubes 的答案(其中利用DRI 來強制執行您的規則)之外,您還可以使用MIN 進行LEFT JOIN,以從每個用戶ID 的三個表中獲取1、2 或3 中的下一個

    回覆
    0
  • 徐涛

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

    沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發

    回覆
    0
  • 徐涛

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

    沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發沙發

    回覆
    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

    回覆
    0
  • 徐涛

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

    阿薩法守法發撒阿薩法守法發撒阿薩法守法發撒阿薩法守法發撒

    回覆
    0
  • 取消回覆