Heim  >  Artikel  >  Datenbank  >  Detaillierte Erklärung der MySQL-Trigger

Detaillierte Erklärung der MySQL-Trigger

小云云
小云云Original
2017-11-22 10:53:522015Durchsuche

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.

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
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);
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);
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 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$
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$
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn