MySQL-Trigger: Beispielanalyse zum Erstellen mehrerer Trigger

MySQL-Trigger: Beispielanalyse zum Erstellen mehrerer Trigger

Dieser Artikel beschreibt anhand eines Beispiels die Erstellung mehrerer Triggeroperationen in MySQL. Teilen Sie uns die Einzelheiten zu Ihrer Information mit:

Die diesmal aufgezeichnete MySQL-Version muss 5.7.2+ sein, frühere Versionen funktionieren nicht. Lassen Sie uns ohne weitere Umschweife loslegen.

Vor MySQL 5.7.2+ konnten wir nur einen Trigger für ein Ereignis in einer Tabelle erstellen, beispielsweise konnten wir nur einen Trigger für ein BEFORE UPDATE- oder AFTER UPDATE-Ereignis erstellen. MySQL-Versionen ab 5.7.2 beheben diese Einschränkung und ermöglichen uns, mehrere Trigger für dasselbe Ereignis und denselben Aktionszeitpunkt in einer Tabelle zu erstellen. Wenn Ereignisse eintreten, werden Auslöser nacheinander aktiviert. Sehen wir uns die Syntax beim Erstellen des ersten Triggers an. Wenn es für eine Tabelle mehrere Trigger für dasselbe Ereignis gibt, ruft MySQL die Trigger in der Reihenfolge auf, in der sie erstellt werden. Um die Reihenfolge der Auslöser zu ändern, geben Sie nach der FOR EACH ROW-Klausel FOLLOWS oder PRECEDES an. Schauen wir uns die Erklärung dieser beiden Wörter an:

  • Mit der Option FOLLOWS können neue Trigger nach vorhandenen Triggern aktiviert werden.
  • Mit der Option PRECEDES können neue Trigger vor vorhandenen Triggern aktiviert werden.

Schauen wir uns abschließend die Syntax zum Erstellen eines neuen zusätzlichen Triggers mit einem expliziten Befehl an:

TRENNUNGSZEICHEN $$
CREATE TRIGGER Triggername
[VORHER|NACHHER] [EINFÜGEN|AKTUALISIEREN|LÖSCHEN] ON Tabellenname
FÜR JEDE ZEILE [FOLGT | GEHT VORHER] vorhandener_Triggername
BEGINNEN
…
ENDE$$
TRENNUNGSZEICHEN ;

Sehen wir uns als Nächstes ein Beispiel für die Erstellung mehrerer Trigger für dasselbe Ereignis und dieselbe Aktion in einer Tabelle an. Lassen Sie uns dies anhand der Produkttabelle demonstrieren. Erstellen Sie zunächst eine neue Tabelle „price_logs“. Wenn der Preis eines Produkts (Spalte „MSRP“) geändert wird, sollte der alte Preis in einer Tabelle namens „price_logs“ aufgezeichnet werden. Werfen wir einen Blick auf das SQL:

Tabelle Preisprotokolle erstellen (
 id INT(11) NOT NULL AUTO_INCREMENT,
 Produktcode VARCHAR (15) NICHT NULL,
 Preis DOUBLE NOT NULL,
 updated_at ZEITSTEMPEL NICHT NULL STANDARD 
       AKTUELLER ZEITSTEMPEL 
       BEIM UPDATE CURRENT_TIMESTAMP,
 Primärschlüssel (ID),
 SCHLÜSSEL Produktcode (Produktcode),
 CONSTRAINT price_logs_ibfk_1 Fremdschlüssel (Produktcode) 
 REFERENZEN Produkte (Produktcode) 
 BEIM LÖSCHEN KASKADE 
 Bei Update-Kaskade
);

Das ist alles. Erstellen Sie einen neuen Trigger, wenn das BEFORE UPDATE-Ereignis der Tabelle eintritt. Der Triggername lautet before_products_update und die konkrete Implementierung ist wie folgt:

TRENNUNGSZEICHEN $$
TRIGGER ERSTELLEN vor_Produktaktualisierung 
  VOR DEM UPDATE ZU PRODUKTEN 
  FÜR JEDE REIHE 
BEGINNEN
   INSERT INTO Preisprotokolle(Produktcode, Preis)
   WERTE(alter.Produktcode,alter.UVP);
ENDE$$
TRENNUNGSZEICHEN ;

Wenn wir dann den Preis eines Produkts ändern, verwenden wir die folgende Update-Anweisung und fragen abschließend die Tabelle price_logs ab:

UPDATE Produkte
SET UVP = 95,1
WO Produktcode = 'S10_1678';
--Abfrageergebnis-Preisdatensätze SELECT * FROM price_logs;

Nach der Ausführung der obigen Abfrageanweisung werden die folgenden Ergebnisse erhalten:

+----+--------------+----------+---------------------+
| ID | Produktcode | Preis | aktualisiert am |
+----+--------------+----------+---------------------+
| 1 | S10_1678 | 95,7 | 03.08.2017 02:46:42 |
+----+--------------+----------+---------------------+
1 Reihe im Set

Wie Sie an den Ergebnissen sehen können, funktioniert es wie erwartet.

Nun nehmen wir an, dass wir nicht nur den alten Preis sehen möchten, sondern auch festhalten möchten, wer diesen bei der Änderung modifiziert hat. Um dies zu erreichen, könnten wir der Tabelle „price_logs“ zusätzliche Spalten hinzufügen. Um jedoch mehrere Auslöser zu demonstrieren, erstellen wir eine neue Tabelle, um Daten über den Benutzer zu speichern, der die Änderungen vorgenommen hat. Der Name dieser neuen Tabelle lautet user_change_logs und ihre Struktur ist wie folgt:

Tabelle „user_change_logs“ erstellen (
 id int(11) NICHT NULL AUTO_INCREMENT,
 Produktcode varchar (15) DEFAULT NULL,
 updated_at Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP 
 BEIM UPDATE CURRENT_TIMESTAMP,
 aktualisiert_durch varchar(30) NICHT NULL,
 Primärschlüssel (ID),
 SCHLÜSSEL Produktcode (Produktcode),
 CONSTRAINT user_change_logs_ibfk_1 Fremdschlüssel (Produktcode) 
 REFERENZEN Produkte (Produktcode) 
 BEIM LÖSCHEN KASKADE BEIM AKTUALISIEREN KASKADE
);

Jetzt erstellen wir einen zweiten Trigger, der beim BEFORE UPDATE-Ereignis in der Produkttabelle aktiviert wird. Dieser Trigger aktualisiert die geänderten Benutzerinformationen in der Tabelle „user_change_logs“. Es wird aktiviert, nachdem before_products_update ausgelöst wurde:

TRENNUNGSZEICHEN $$
TRIGGER ERSTELLEN before_products_update_2 
  VOR DEM UPDATE ZU PRODUKTEN 
  FÜR JEDE ZEILE FOLGT before_products_update
BEGINNEN
  INSERT INTO user_change_logs(Produktcode, aktualisiert von)
  WERTE(alter.Produktcode,Benutzer());
ENDE$$
TRENNUNGSZEICHEN ;

Anschließend verwenden wir die Update-Anweisung, um den Preis des angegebenen Produkts zu aktualisieren:

UPDATE Produkte
SET UVP = 95,3
WO Produktcode = 'S10_1678';

Als Nächstes fragen Sie Daten aus den Tabellen „price_logs“ und „user_change_logs“ ab:

mysql> AUSWÄHLEN * VON Preisprotokollen;
+----+--------------+----------+---------------------+
| ID | Produktcode | Preis | aktualisiert am |
+----+--------------+----------+---------------------+
| 1 | S10_1678 | 95,7 | 03.08.2017 02:46:42 |
| 2 | S10_1678 | 95,1 | 03.08.2017 02:47:21 |
+----+--------------+----------+---------------------+
2 Reihen im Set
mysql> AUSWÄHLEN * AUS Benutzeränderungsprotokollen;
+----+--------------+---------------------+----------------+
| ID | Produktcode | aktualisiert am | aktualisiert von |
+----+--------------+---------------------+----------------+
| 1 | S10_1678 | 03.08.2017 02:47:21 | root@localhost |
+----+--------------+---------------------+----------------+
1 Reihe im Set

Wie Sie oben sehen können, werden die beiden Auslöser in der erwarteten Reihenfolge aktiviert, um die zugehörigen Vorgänge auszuführen. Sehen wir uns nun die Spalte „action_order“ in der Tabelle „triggers“ der Datenbank „information_schema“ an, um die Reihenfolge anzuzeigen, in der dasselbe Ereignis und dieselbe Aktion ausgelöst werden:

mysql> AUSWÄHLEN 
  Triggername, Aktionsreihenfolge
AUS
  information_schema.triggers
WO
  trigger_schema = "yiibaidb"
ORDER BY Ereignisobjekttabelle, 
     Aktionszeitpunkt, 
     Ereignismanipulation;
+--------------------------+--------------+
| Auslösername | Aktionsreihenfolge |
+--------------------------+--------------+
| vor_Mitarbeiteraktualisierung | 1 |
| vor_Produktaktualisierung | 1 |
| vor_Produktupdate_2 | 2 |
+--------------------------+--------------+
3 Reihen im Set

Okay, das ist alles zu diesem Eintrag.

Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“, „Zusammenfassung der Kenntnisse zu MySQL-Datenbanksperren“ und „Zusammenfassung der allgemeinen MySQL-Funktionen“.

Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist.

Das könnte Sie auch interessieren:
  • MySQL-Trigger-Verwendungsszenarien und Methodenbeispiele
  • MySQL-Triggerprinzip und Analyse von Anwendungsbeispielen
  • Einfaches Beispiel für die Definition und Verwendung von MySQL-Triggern
  • Detailliertes Beispiel für die Verwendung von MySQL-Triggern
  • MySQL verwendet Trigger, um das Zeilenlimit der Tabelle in der Datenbank zu lösen. Detaillierte Erklärung und Beispiele
  • MySQL-Trigger: ausführliche Erklärung und einfaches Beispiel
  • Beispiel-Tutorial zur Verwendung von MySQL-Triggern zum Migrieren und Synchronisieren von Daten
  • Eine kurze Zusammenfassung und Beispiele für MySQL-Trigger
  • Ein einfaches Beispiel und eine Einführung in MySQL-Trigger
  • Detaillierte Erklärung des MySQL-Triggerbeispiels

<<:  Die ultimative Lösung zum Schreiben von Bash-Skripten mit Node.js

>>:  So zeigen Sie den Kennwortablauf unter Linux an und konfigurieren ihn

Artikel empfehlen

Müssen die Texte der Website noch gestaltet werden?

Viele fragen sich vielleicht: Muss der Text auf d...

Remote-Entwicklung mit VSCode und SSH

0. Warum brauchen wir Remote-Entwicklung? Bei der...

So lösen Sie das Problem, dass Tomcat9.exe abstürzt

Ein Leser kontaktierte mich und fragte, warum es ...

Implementieren einer benutzerdefinierten Bildlaufleiste mit nativem JS

In diesem Artikelbeispiel wird der spezifische JS...

Native JavaScript-Karussell-Implementierungsmethode

In diesem Artikel wird die Implementierungsmethod...

Ausführliche Erklärung verschiedener binärer Objektbeziehungen in JavaScript

Inhaltsverzeichnis Vorwort Beziehungen zwischen v...

JS realisiert Bild Digitaluhr

In diesem Artikelbeispiel wird der spezifische JS...

Methoden und Probleme bei der Installation von MariaDB in CentOS unter MySQL

Löschen Sie die zuvor installierte MariaDB 1. Ver...

Docker Detaillierte Abbildungen

1. Einführung in Docker 1.1 Virtualisierung 1.1.1...

HTML5+CSS3-Codierungsstandards

Die goldene Regel Unabhängig davon, wie viele Per...

So beenden Sie den MySQL-Prozess ordnungsgemäß und sicher

Vorwort In diesem Artikel wird der Vorgang zum He...