30
Aug

Trigger in MySQL

categories Computer, MySQL, Tutorials    

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:

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;

In MySQL kann man ein timestamp-Feld mit zwei verschiedenen Optionen belegen, welche man auch kombinieren kann:

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:

CREATE TRIGGER  t1_neuanlage_timestamp 
BEFORE INSERT on t1
FOR EACH ROW 
SET NEW.anlage = NOW();

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:

CREATE TRIGGER  t1_update_timestamp 
BEFORE UPDATE on t1
FOR EACH ROW 
SET NEW.update = NOW();

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…

 
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;

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!

18
Mär

Installation einer XAMP-Umgebung

categories MySQL, PHP, Tutorials    

Aufgrund eines neuen Rechners kam ich mal wieder in die Verlegenheit, meine private Entwicklungsumgebung neu einzurichten. Die üblichen Entwickler-Suites (z.B. Visual Studio 2005, UltraEdit, PHPEdit u.v.m.) sind via Setup zügig installiert. Ich möchte jedoch noch lokal – d.h. unter WinXP (prof.) – einen kleinen HTTP-Server bedienen, mit welchem ich später datenbanklastige PHP-Skripte kreieren und testen kann.

Plan A: Download von XAMPP für Windows.
Plan B: Selbermachen!

Ich stimme für Plan B – dabei lernt man üblicherweise am meisten über die verwendeten Systeme. Was benötige ich dafür?

(more…)

← Previous Page