2
Okt

Sommerzeit oder Winterzeit?

categories MySQL, SQL-Schnipsel    

Inspiriert von Shinguz habe ich auf eigene Faust mal versucht, via SQL zu prüfen, ob wir uns in Sommerzeit oder Winterzeit befinden.

Hier mein SQL-Resultat (funzt mit MySQL):

SELECT
    IF(TIMESTAMPDIFF(
        HOUR , UTC_TIMESTAMP(), SYSDATE()
      ) = 2,
      'Sommerzeit',
      'Winterzeit')
AS "Zeit";

Zwar würde ich sowas eher via Programmcode lösen, aber auf einem zeittechnisch ordentlich aufgesetzten Datenbankserver lässt sich sowas durchaus verwenden!

15
Okt

Betragsformatierung in SELECT-Statements

categories Computer, MySQL, SQL-Schnipsel, Tutorials    

Vielleicht stand der ein oder andere schonmal vor dem Problem, einen Betrag direkt aus einem SELECT-Statement heraus formatieren zu müssen, ohne das Ergebnis nachträglich mit einem anderen Hilfsmittel (z.B. mittels Programmcode, Reportgenerator o.ä.) zu “veredeln”.

Mir ging es jedenfalls heute so, daher folgt hier mein Lösungsweg.
(weiterlesen…)

23
Sep

Upgrade von MySQL (Windows)

categories Computer, MySQL, Tutorials    

Aufgrund eines Tests der neuen MySQL-Funktion “Partitionierung” erachtete ich es als notwendig, mal wieder meine kleine Testinstallation des MySQL-Community-Servers auf einen aktuellen Stand zu bringen. Derzeit aktuell ist 5.1.28, deklariert als Release Candidate, bis dato lief 5.0.67.

Da es sich nur um ein Testsystem handelt, war dieses Update natürlich unkritisch – für Produktionsumgebungen empfehle ich konventionellere Wege, wesentlich sorgfältigeres Vorbereiten und genaues Befolgen der von MySQL empfohlenen Installationsschritte.

1. Backup der bestehenden Installation + Daten
…läuft in meiner Testumgebung ohnehin nächtlich als Batch, somit prüfte ich nur, ob es lief bzw. wann zuletzt Änderungen an der Test-DB vorgenommen worden sind.

2. Download der Binaries
http://dev.mysql.com/downloads/mysql/5.1.html, ich entschied mich für die Windows-Variante “without installer”. Man bezieht damit ein gepacktes Archiv mit allen Binaries und Skripten.

3. Anhalten des Dienst
Da ich den MySQL-Server als Dienst laufen lasse, muss dieser vor dem Upgrade gestoppt werden. Wie? Entweder via Kommandozeile oder via GUI (Verwaltung / Dienste / Mysql – Dienst anhalten).

4. Binaries in die bestehende Installation kopieren
Ich entpackte das vorher gedownloadete Archiv direkt und gnadenlos in das Programmverzeichnis, unter welchem meine alte MySQL-Installation lief.

5. Dienst starten
Auch hier gilt: entweder via Kommandozeile oder via GUI (Verwaltung / Dienste / Mysql – Dienst starten). Und siehe da, der Server läuft wieder.

6. Update-Programm von MySQL ausführen
…am besten via Kommandozeile:

mysql-upgrade.exe

(versteckt sich im /bin-Verzeichnis).
Dieses Tool startet mehrere MySQL-Kontrollskripts und -Programme, welche die bestehenden Datenbanken auf Inkompabilitäten prüft und ggf. repariert. Auch werden die Privilegien entsprechend angepasst.

Fertig!

Am längsten dauerte der Download, es handelt sich um insgesamt etwa 90 MB. Insgesamt hatte ich die Installation innerhalb von fünf Minuten aktualisiert. Und jetzt bin ich gespannt, was das Partitionieren hergibt! ;-)

20
Okt

Die Angst des Programmierers vor dem SQL-Join

categories Computer, MySQL, Tutorials    

Ein Artikel von Jeff Atwood in seinem Blog “Coding Horror” sowie zwei passgenau zum gleichen Zeitpunkt sich ereignende programmiertechnische Episoden reizen mich, mal eine Lanze für Joins in SQL-Statements zu brechen. Joins sind eine schöne Sache und eigentlich nicht sehr schwierig. Aktuelle RDBMS kommen prima mit Joins aus, also gibt es Gründe, auf Joins zu verzichten?
(weiterlesen…)

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!

Next Page →

WP SlimStat