Verwenden von Triggern und Einschränkungen, um die Anzahl der Datensätze in MySQL zu begrenzen
P粉807397973
P粉807397973 2023-11-14 13:35:02
0
4
1032

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

Antworte allen(5)
P粉113938880

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

徐涛

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

徐涛

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

P粉769413355

向恰好包含 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
徐涛

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage