Bei MySQL EVENT geht es darum, zu einer bestimmten Zeit oder in bestimmten Intervallen MySQL-Kommandos auszuführen, z. B. Routinen aufrufen.
Anwendungsmöglichkeiten
EVENTs sind immer dann nützlich wenn Aufgaben zyklisch ausgeführt werden sollen.
- Datenbank zu einem bestimmten Zeitpunkt bereinigen
- alte Daten löschen
- neue Daten hinzufügen
- zu einen bestimmten Intervall Daten auslesen (z. B. Messdaten)
Voraussetzung
Damit wir EVENT überhaupt benutzen können, sollten wir zuerst den Scheduler einschalten. Dafür muss man die Variable event_scheduler auf ON bzw. 1 setzen.
OFF oder 0: Scheduler ist aus, erscheint auch nicht in SHOW PROCESSLIST
ON oder 1: Scheduler läuft und ist in der SHOW PROCESSLIST
DISABLED: dasselbe wie OFF
Um den Scheduler einzuschalten, gibt es zwei Möglichkeiten
- für Konfigurationsdatei (my.ini) reicht event_scheduler=1;
- SET GLOBAL event_Scheduler=ON;‘
Info
Ereignisse auflisten SHOW EVENTS;
Prüfen der Scheduler on oder off ist SHOW PROCESSLIST;
Hinweis
Damit nicht immer der SCHEDULER beim Neustart der Datenbank aktivieren muss, kann dies auch in der Konfigurationsdatei my.ini hinterlegt werden.
[mysqld] event-scheduler = 1
Syntax
CREATE EVENT event_Name ON SCHEDULE AT {DATE AND TIME} DO {SQL COMMAND}; ‘ODER CREAT EVENT event_Name ON SCHEDULE EVERY {x=Zahl z.B. 1} {SECOND|MINUTE|HOUR|DAY|MONTH|YEAR|WEEK} DO {SQL COMMAND};
Weitere Syntax Möglichkeiten
CREATE EVENT alter_event ON SCHEDULE EVERY 6 HOUR DO UPDATE event.test_alter SET zahl = zahl +1; ALTER EVENT alter_event ON SCHEDULE COMMENT ‘alter_event wird ab sofort nur noch alle 12 Std. ausgeführt.‘ EVERY 12 HOUR COMMENT ‘ Beginnend 4 Std. ab dem Zeitpunkt an dem die Anweisung ausgeführt wird. ‘ STARTS CURRENT_TIMESTAMP + INTERVAL 4 HOUR;
CREATE EVENT artikel_event ON SCHEDULE EVERY 1 MINUTE DO INSERT INTO artikel (artikel) values ((Select bezeichnung from artikel_neu where ok = 1));
CREATE EVENT update_event ON SCHEDULE EVERY 90 SECOND DO UPDATE artikel_neu SET ok=0 WHERE ok = 1;
Folgende Datenbank wird für beide Beispiele benötigt!
Anlegen einer Datenbank event mit zwei Tabellen artikel und artikel_neu.
CREATE DATABASE event; CREATE TABLE artikel( ID INT NOT NULL auto_increment primary key, ARTIKEL VARCHAR(100)) ENGINE = INNODB; CREATE TABLE artikel_neu( ID INT NOT NULL auto_increment primary key, Bezeichnung VARCHAR(100), OK INT NOT NULL) ENGINE = INNODB;
Beispiel 1
Über ein EVENT neu_event wird eine Procedure proc_event aufgerufen, welche Datensätze zu einem bestimmten Zeitpunkt in die Tabelle artikel einfügt.
Der Scheduler muss aktiviert sein!
1. Procedure proc_event erstellen
DELIMITER // DROP PROCEDURE if exists proc_event; CREATE PROCEDURE proc_event ( IN E_ID INT, IN E_artikel VARCHAR(100) ) BEGIN INSERT INTO event.artikel ( ID, Artikel ) VALUES ( E_ID, E_artikel ); // DELIMITER ;
2. EVENT neu_event erstellen
CREATE EVENT neu_event ON SCHEDULE AT ‘2013-04-17 14:05:00’ DO CALL proc_event(null, “WERT”);
Beispiel 2
Das EVENT neu_artikel ruft zu einem bestimmten Intervall eine Procedure proc_insert auf, diese überprüft die Spalte ok in der Tabelle artikel_neu, ob der Wert 1 entspricht.
Trifft dies zu, so wird der Datensatz in die Taballe artikel geschrieben und der Wert 1 auf 0 gesetzt.
Der Scheduler muss aktiviert sein!
1. Procedure proc_event_insert erstellen
CREATE DROP PROCEDURE IF EXISTS proc_event_insert; DELIMITER // CREATE PROCEDURE event.proc_event_insert () BEGIN DECLARE posID, ende INT DEFAULT 0; DECLARE posBez VARCHAR(100); DECLARE curArt CURSOR FOR SELECT id, bezeichnung FROM artikel_neu WHERE OK=1; DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN SET ende=1; END; SET ende=0; OPEN curArt; REPEAT FETCH curArt INTO posID, posBez; IF ende=0 THEN INSERT INTO artikel (id,artikel) VALUES (null,posBez); UPDATE artikel_neu SET ok=0 WHERE ID=posID; END IF; UNTIL ende=1 END REPEAT; CLOSE curArt; END; // DELIMITER ;
2. EVENT neu_event_insert erstellen
drop event if exists new_artikel; create event neu_artikel on schedule every 1 SECOND Do call proc_event_insert();