Aufgabenstellung:
Wir benötigen zwei Zeitstempel innerhalb einer Tabelle mit einigen darauf verweisenden Tabellen. Der eine Zeitstempel soll das Anlagedatum des Datensatz darstellen, der zweite das „zuletzt aktualisiert“-Datum. Schön wäre, wenn die Tabelle diese Felder automatisch setzen würde.
Hierfür baue ich mir erstmal eine Testtabelle:
[sql]
CREATE TABLE `t1` (
`kundennummer` int(11) NOT NULL,
`testfeld1` int(11) NOT NULL,
`anlage` timestamp NOT NULL default ‚0000-00-00 00:00:00‘,
`update` timestamp NOT NULL default ‚0000-00-00 00:00:00‘,
PRIMARY KEY (`kundennummer`)
) ENGINE=MyISAM DEFAULT;
[/sql]
In MySQL kann man ein timestamp-Feld mit zwei verschiedenen Optionen belegen, welche man auch kombinieren kann:
-
DEFAULT CURRENT_TIMESTAMP
-
ON UPDATE CURRENT_TIMESTAMP
Prima, genau das, was ich für die Anforderung benötige!
Die Sache hat leider nur einen kleinen Haken: Je Tabelle darf nur ein einziges timestamp-Feld mit diesen Optionen belegt sein. Wie löse ich nun die Aufgabenstellung?
Die Antwort lautet: Trigger.
Ein Trigger ist ein Eventhandler für Tabellen (dies ist meine persönliche Definition, sicher gibt es wesentlich treffendere Bezeichnungen). Drei Events können getriggert werden: INSERT, UPDATE und DELETE (bitte hier nicht gleichsetzen mit den gleichlautenden SQL-Kommandos, z.B. fällt unter einem INSERT z.B. auch ein LOAD DATA u.s.w.). Man kann frei wählen, ob die gewünschte Aktion vor oder nach dem Event ausgeführt werden soll. Damit liefert uns die Datenbank ein Feature, mit welchem – soviel fand ich nach meinen ersten Spielereien mit der Funktion Trigger selbst heraus – extrem viele lustige Dinge anstellen.
So sieht mein Trigger für das Setzen des Neuanlagedatums aus:
[sql]CREATE TRIGGER t1_neuanlage_timestamp
BEFORE INSERT on t1
FOR EACH ROW
SET NEW.anlage = NOW();
[/sql]
Im Klartext bedeutet dies, dass jedes Insert-Event (sei es denn durch einen Dump oder einem SQL-Insert) dazu führt, das Feld „anlage“ des neuen Datensatz mit dem aktuellen Datum zu versehen.
Gleiches geht natürlich auf für Setzen des Aktualisierungsdatum:
[sql]CREATE TRIGGER t1_update_timestamp
BEFORE UPDATE on t1
FOR EACH ROW
SET NEW.update = NOW();[/sql]
Gleiches Prinzip, nahezu gleiche Wirkung – funktioniert reibungslos! Damit ist die Anforderung sauber umgesetzt.
Hier noch ein einfaches Szenario, wie man Trigger etwas weitergehend verwenden kann:
Angenommen, für o.a. Tabelle gibt es eine zweite Tabelle mit direkter Abhängigkeit. Angenommen, man möchte bei Änderungen in Tabelle 2 die Aktualisierung in Tabelle 1 setzen. Kein Problem mit Trigger. Seht selbst…
[sql]
CREATE TABLE `t2` (
`kundennummer` int(11) NOT NULL,
`testfeld2` int(11) NOT NULL,
PRIMARY KEY (`kundennummer`)
) ENGINE=MyISAM DEFAULT;
CREATE TRIGGER t2_update_timestamp
BEFORE UPDATE on t2
FOR EACH ROW
UPDATE t1
SET t1.update = NOW()
WHERE t1.kundennummer = NEW.kundennummer;[/sql]
Fertig!
Einschränkungen gibt es zwar auch für Trigger in MySQL, jedoch sind diese recht überschaubar. Trigger sind sehr gut dokumentiert, sodass man sicherlich die meisten Fragestellungen – wie so oft – im Handbuch klären kann!
Schreibe einen Kommentar