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
830

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
            Über uns Haftungsausschluss Sitemap
            Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!