Kategorien
Computer MySQL Tutorials

Trigger in MySQL

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!

Kategorien
Sportliches

Pressespiegel: England – Germany 1:2

Eigentlich erwartete ich nach dem gestrigen Freundschaftsspiel zwischen Deutschland und England im der neuen Wembley-Arena eine etwas anregendere Presseschlacht – vielleicht gab das Spiel aber nicht mehr her…!

zuerst die englische Presse…

Daily Mirror

It was even more cruel that it had to be against the arch footballing enemy, but many of England’s old weaknesses and frailties were harshly exposed last night.

The Sun

What a load of Robbish! Michael Owen was rather tempting fate when he said on the front of last night’s programme: “Let’s see if anyone can beat us here.” So-called ‘Fortress Wembley’ has produced one draw and one defeat for England in their two matches.

BBC

England suffered a first loss at the new Wembley as Germany took advantage of a mistake by keeper Paul Robinson.

SkyNews

Pander punishes Three Lions! England fall to Wembley defeat. On a night in which a sell-out Wembley crowd prayed for an accomplished England performance, a Germany debutant failed to read the script, as Christian Pander’s sublime strike secured a 2-1 victory for old foes.

The Independant

Robinson’s blunder leaves England seeking new No 1. Steve McClaren refused to give his unreserved backing to Paul Robinson last night after the England goalkeeper made the error which led to the national team’s first defeat at the new Wembley, in only their second international there.

So schrieben die deutschen Nachrichtendienste…

Der Spiegel

Deutschland feiert ersten Gäste-Sieg im neuen Wembley. Ob alt oder neu: Das Wembley-Stadion ist für die deutsche Fußball-Nationalelf ein gutes Pflaster

Stern

Löws Elf stürmt die Wembley-Arena. Trotz zahlreicher Ausfälle gelang der deutschen Nationalelf ein ganz besonderer Sieg: Kuranyi und Neuling Pander schossen ihr Team gegen England zum Erfolg. Und das trotz frühem Gegentor.

Frankfurter Rundschau

B-Team besiegt England. Die deutsche Fußball-Nationalmannschaft hat das erste Länderspiel der neuen Saison gewonnen. Am Mittwochabend siegte die DFB-Elf im traditionsreichen Duell im neuen Londoner Wembleystadion gegen England 2:1 (1:0), nachdem das DFB-Team die Briten bereits im letzten Spiel im alten Wembeystadion vor knapp sieben Jahren bezwungen hatte.

Die Zeit

Prestige-Duell: DFB-Team besiegt England. Eine stark ersatzgeschwächte deutsche Nationalelf hat die 30. Auflage des Klassikers gegen England gewonnen. Im neuen Londoner Wembley-Stadion traf neben Kevin Kuranyi auch ein mutiger Debütant.

Kategorien
out of the ordinary

Sehr eilig

Nachdem ich in den vergangenen vierzehn Jahren schätzungsweise eine halbe Millionen Kilometer mit verschiedenen Fahrzeugen durch Europa gefahren bin, sind mir schon einige Kuriositäten begegnet: Rehe in dunklen Wäldern, Schafe und Kuhherden in England, Wildschweinfamilien, unachtsam geparkte Motorräder, eine große Anzahl unachtsamer PKW-Fahrer u.v.m. haben mich immer wieder zum Staunen bringen können.

Aber noch nie wurde ich von einem großen Caravan auf einer Autobahnabfahrt (hier: A66-Gründau von Hanau kommend) überholt!

Kategorien
Fundstücke

Darth Vader




darth_vader

Originally uploaded by arathorn2005

Da spaziert man gemütlich durch das Outlet-Dorf Clarks Village (bei Glastonbury, UK) und versucht, seine Liebste von allzu vielen Einkäufen abzuhalten… und wen sieht man da?

David Prowse – der Herr unter der Maske von Darth Vader!

PS: Er ist der Herr, welcher vor der Jabba-Figur sitzt…

Kategorien
Fundstücke Musikalien

Britain’s got talent.

Und zwar ordentlich.