Heim >Datenbank >MySQL-Tutorial >Detaillierte Erklärung der MySQL-Trigger
Was ist ein Trigger:
Trigger ist eine Methode, die Programmierern und Datenanalysten vom SQL-Server zur Verfügung gestellt wird, um die Datenintegrität sicherzustellen. Es handelt sich um einen speziellen Speicherprozess, der sich auf Tabellenereignisse bezieht, dessen Ausführung nicht aufgerufen wird B. ein Programm oder manuell gestartet, sondern durch Ereignisse ausgelöst wird. Wenn beispielsweise eine Tabelle bedient wird (Einfügen, Löschen, Aktualisieren), wird deren Ausführung aktiviert. Trigger werden häufig verwendet, um Datenintegritätseinschränkungen und Geschäftsregeln durchzusetzen. Trigger finden Sie in den Datenwörterbüchern DBA_TRIGGERS und USER_TRIGGERS. Ein SQL3-Trigger ist eine Anweisung, die vom System automatisch ausgeführt werden kann, um die Datenbank zu ändern.
Trigger-Syntax:
CREATE TRIGGER be598617b6f9e8a2ec02088e63ec4c60 – Der Trigger muss einen Namen mit bis zu 64 Zeichen haben und kann von einem Trennzeichen gefolgt werden MySQL Die Benennungsmethoden anderer Objekte sind grundsätzlich ähnlich.
{ INSERT |. DELETE } --Sie können auch die ausgelösten Ereignisse festlegen: Sie können während der Ausführung von Einfügen, Aktualisieren oder Löschen ausgelöst werden.
EIN 2a59fb221d0bc3b07e1e43cec3d4767d – Der Trigger gehört zu einer bestimmten Tabelle: Wenn ein Einfüge-, Aktualisierungs- oder Löschvorgang für diese Tabelle ausgeführt wird, kann der Trigger nicht derselben Tabelle zugewiesen werden Das Ereignis plant zwei Auslöser.
FOR EACH ROW – Trigger-Ausführungsintervall: Die FOR EACH ROW-Klausel weist den Trigger an, jede zweite Zeile eine Aktion auszuführen, und nicht einmal für die gesamte Tabelle.
bafc9aeef59c735ec307991344d7ea3a – Der Trigger enthält die auszulösende SQL-Anweisung: Die Anweisung hier kann jede beliebige legale Anweisung sein, einschließlich zusammengesetzter Anweisungen, aber die Anweisungen hier unterliegen denselben Einschränkungen wie Funktionen.
create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 beginSQL-Anweisung;Ende;Hinweis: Jede Farbe entspricht den vier oben genannten Elementen. Zuerst erstellen wir zwei Tabellen:
#商品表 create table g ( id int primary key auto_increment, name varchar(20), num int ); #订单表 create table o ( oid int primary key auto_increment, gid int, much int ); insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10);Wenn wir keine Trigger verwenden: Angenommen, wir verkaufen jetzt 3 Artikel 1, müssen wir zwei Dinge tun1 . Fügen Sie einen Datensatz in die Bestelltabelle ein
insert into o(gid,much) values(1,3);2. Aktualisieren Sie die verbleibende Menge von Artikel 1 in der Produkttabelle
update g set num=num-3 where id=1;Jetzt erstellen wir einen Trigger:Sie müssen zuerst diese Anweisung ausführen: delimiter $ (bedeutet, dass die MySQL-Anweisung mit $ enden soll)
create trigger tg1 after insert on o for each row begin update g set num=num-3 where id=1; end$Zu diesem Zeitpunkt müssen wir nur Folgendes ausführen:
insert into o(gid,much) values(1,3)$Sie werden feststellen, dass sich die Menge von Produkt 1 auf 7 geändert hat, was bedeutet, dass der Trigger beim Eingeben einer Bestellung automatisch den Aktualisierungsvorgang für uns durchführt. Aber jetzt gibt es ein Problem, denn die Nummer und die ID in unserem Trigger sind fest codiert, sodass die Menge von Produkt 1 unabhängig davon, welches Produkt wir kaufen, am Ende aktualisiert wird. Beispiel: Wir fügen einen weiteren Datensatz in die Bestelltabelle ein: insert into o(gid,much) Values(2,3) Nach der Ausführung werden wir feststellen, dass sich die Menge von Produkt 1 auf 4 geändert hat, die Menge von Produkt 2 jedoch Dies ist offensichtlich nicht der Fall, den wir wollen. Wir müssen den Trigger ändern, den wir zuvor erstellt haben. Wie referenzieren wir den Wert der Zeile im Trigger, d. h. wir müssen den Wert von gid oder much in unserem neu eingefügten Bestelldatensatz abrufen? Beim Einfügen wird die neu eingefügte Zeile durch new dargestellt, und der Wert jeder Spalte in der Zeile wird durch new.column name dargestellt. Jetzt können wir unseren Trigger also so ändern
create trigger tg2 after insert on o for each row begin update g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同) end$Der zweite Trigger wird erstellt, löschen wir zuerst den ersten TriggerDrop Trigger tg1$Testen Sie es erneut und fügen Sie einen Bestelldatensatz ein: insert into o(gid,much) Values(2,3)$Nach der Ausführung wird festgestellt, dass sich die Menge von Produkt 2 auf 7 geändert hat. Okay, das ist genau jetzt. Es gibt immer noch zwei Situationen: 1. Wenn ein Benutzer eine Bestellung storniert, müssen wir die entsprechende Warenmenge wieder hinzufügen? 2. Wie schreiben wir die Auslöseränderung, wenn der Benutzer die Menge einer Bestellung ändert?Lassen Sie uns zuerst die erste Situation analysieren: Überwachungsort: o Tabelle Überwachungsereignis: LöschenTriggerzeit: nachTriggerereignis: AktualisierenZum Löschen: Ursprünglich gab es eine Zeile, die jedoch später gelöscht wurde . Um auf die gelöschte Zeile zu verweisen, verwenden Sie old, um sie darzustellen. Der Spaltenname kann auf den Wert der gelöschten Zeile verweisen. Dann sollte unser Trigger so geschrieben sein:
create trigger tg3 after delete on o for each row begin update g set num = num + old.much where id = old.gid;(注意这边的变化) end$Erstellung abgeschlossen. Führen Sie delete from o where oid = 2$ aus und Sie werden feststellen, dass sich die Menge von Produkt 2 wieder auf 10 geändert hat. Zweiter Fall: Überwachungsort: O-TischÜberwachungsereignis: AktualisierungAuslösezeit: nachAuslöseereignis: Aktualisierung Für die Aktualisierung: die geänderte Zeile, die Daten vor der Änderung, dargestellt durch alt, alt. Der Spaltenname bezieht sich auf den Wert in der Zeile vor der Änderung. nach der Änderung werden die Daten dargestellt durch neu, und der neue Spaltenname bezieht sich auf den Wert in der Zeile, nachdem er geändert wurde. Dann sollte unser Auslöser so geschrieben sein:
create trigger tg4 after update on o for each row begin update g set num = num+old.much-new.much where id = old/new.gid; end$Stellen Sie zuerst die alte Menge wieder her und subtrahieren Sie dann die neue Menge, um die geänderte Menge zu erhalten.
Lassen Sie es uns testen: Löschen Sie zunächst die Daten in der Produkttabelle und der Bestelltabelle, um das Testen zu erleichtern.
Angenommen, wir fügen drei Produkte in die Produkttabelle ein, die Mengen sind alle 10,
Kaufe 3 Produkte 1: füge in o(gid,much) Werte(1,3)$ ein
Zu diesem Zeitpunkt beträgt die Menge von Produkt 1 7;
Wir ändern den eingefügten Bestelldatensatz: update o set much = 5 where oid = 1$
Wir wechseln zu buy 5 Produkt 1. Wenn Sie zu diesem Zeitpunkt die Produkttabelle abfragen, werden Sie feststellen, dass die Anzahl von Produkt 1 nur 5 beträgt, was bedeutet, dass unser Auslöser funktioniert hat.
In diesem Artikel dreht sich alles um Auslöser. Ich hoffe, er kann Ihnen helfen.
Verwandte Empfehlungen:
Detaillierte Erläuterung von Indizes und Triggern in MySQL
Detaillierte Erläuterung der Trigger-Operationsbeispiele in MySQL
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der MySQL-Trigger. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!