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 – 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 – 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.
– 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.
Für eine Tabelle kann nur ein Auslöser erstellt werden
Auslöser: Überwachen Sie eine bestimmte Situation und lösen Sie einen bestimmten Vorgang aus.
Vier Elemente der Trigger-Erstellungssyntax: 1. Überwachungsort (Tabelle) 2. Überwachungsereignis (Einfügen/Aktualisieren/Löschen) 3. Auslösezeit (nach/vor) 4. Auslösendes Ereignis (Einfügen/Aktualisieren/Löschen). ) )
Syntax:
create trigger triggerName
after/before insert/update/delete on 表名
for each row #这句话在mysql是固定的
begin
Nach dem Login kopieren
SQL-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);
Nach dem Login kopieren
Wenn wir keine Trigger verwenden: Angenommen, wir verkaufen jetzt 3 Artikel 1, müssen wir zwei Dinge tun
1 . Fügen Sie einen Datensatz in die Bestelltabelle ein
insert into o(gid,much) values(1,3);
Nach dem Login kopieren
2. Aktualisieren Sie die verbleibende Menge von Artikel 1 in der Produkttabelle
update g set num=num-3 where id=1;
Nach dem Login kopieren
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$
Nach dem Login kopieren
Zu diesem Zeitpunkt müssen wir nur Folgendes ausführen:
insert into o(gid,much) values(1,3)$
Nach dem Login kopieren
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$
Nach dem Login kopieren
Der zweite Trigger wird erstellt, löschen wir zuerst den ersten Trigger
Drop 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öschen
Triggerzeit: nach
Triggerereignis: Aktualisieren
Zum 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$
Nach dem Login kopieren
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: Aktualisierung
Auslösezeit: nach
Auslö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$
Nach dem Login kopieren
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:
Fragen zu MySQL-Triggern
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!