MySQL
LÖST AUS
Suche…
Syntax
- CREATE [DEFINER = {Benutzer | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name Für jede Zeile [trigger_order] trigger_body
- trigger_time: {VOR VOR | NACH DEM }
- trigger_event: {INSERT | UPDATE | LÖSCHEN}
- trigger_order: {FOLLOWS | PRECEDES} other_trigger_name
Bemerkungen
Wenn Sie bei anderen DBs bereits Trigger verwenden, müssen Sie zwei Punkte beachten:
FÜR JEDE REIHE
FOR EACH ROW
ist ein obligatorischer Teil der Syntax
Sie können keine Anweisung auslösen (einmal durch Abfrage) wie Oracle. Es handelt sich eher um ein leistungsbezogenes Problem als um ein wirklich fehlendes Feature
TRIGGER ERSTELLEN ODER ERSETZEN
Das CREATE OR REPLACE
wird von MySQL nicht unterstützt
MySQL erlaubt diese Syntax nicht, Sie müssen stattdessen Folgendes verwenden:
DELIMITER $$
DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...
$$
DELIMITER ;
Seien Sie vorsichtig, dies ist keine atomare Transaktion :
- Sie verlieren den alten Auslöser, wenn
CREATE
fehlschlägt -
LOCK TABLES myTable WRITE;
Last können andere Operationen zwischenDROP
undCREATE
werden. Verwenden SieLOCK TABLES myTable WRITE;
zuerst, um Dateninkonsistenz undUNLOCK TABLES;
zu vermeidenUNLOCK TABLES;
nach demCREATE
, um die Tabelle freizugeben
Grundauslöser
Tabelle erstellen
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
Trigger erstellen
mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
-> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)
Die CREATE TRIGGER-Anweisung erstellt einen Auslöser mit dem Namen ins_sum, der der Kontentabelle zugeordnet ist. Sie enthält auch Klauseln, die die Auslöseraktionszeit, das auslösende Ereignis und die Vorgehensweise bei der Aktivierung des Auslösers angeben
Wert einfügen
Um den Trigger zu verwenden, setzen Sie die Akkumulatorvariable (@sum) auf Null, führen Sie eine INSERT-Anweisung aus und sehen Sie dann, welchen Wert die Variable danach hat:
mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+
In diesem Fall ist der Wert von @sum nach der Ausführung der INSERT-Anweisung 14.98 + 1937.50 - 100 oder 1852.48.
Abzug auslösen
mysql> DROP TRIGGER test.ins_sum;
Wenn Sie eine Tabelle löschen, werden auch alle Auslöser für die Tabelle gelöscht.
Arten von Auslösern
Zeitliche Koordinierung
Es gibt zwei Modifikatoren für die Auslöseraktion:
-
BEFORE
Trigger aktiviert wird, bevor die Anforderung ausgeführt wird. -
AFTER
Auslösen des Feuers nach der Änderung.
Auslöseereignis
Es gibt drei Ereignisse, an die Trigger angehängt werden können:
-
INSERT
-
UPDATE
-
DELETE
Vor dem Trigger-Beispiel einfügen
DELIMITER $$
CREATE TRIGGER insert_date
BEFORE INSERT ON stack
FOR EACH ROW
BEGIN
-- set the insert_date field in the request before the insert
SET NEW.insert_date = NOW();
END;
$$
DELIMITER ;
Vor dem Update-Trigger-Beispiel
DELIMITER $$
CREATE TRIGGER update_date
BEFORE UPDATE ON stack
FOR EACH ROW
BEGIN
-- set the update_date field in the request before the update
SET NEW.update_date = NOW();
END;
$$
DELIMITER ;
Nach dem Löschbeispiel
DELIMITER $$
CREATE TRIGGER deletion_date
AFTER DELETE ON stack
FOR EACH ROW
BEGIN
-- add a log entry after a successful delete
INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;
$$
DELIMITER ;