Das mit dem Wald und den Bäumen!

Wie war das noch gleich damit? Irgendwie habe ich das wieder mal vergessen. Und so kam es, dass ich gestern Abend mal wieder stundenlang vor einem Problem saß und mir die Haare am raufen war, obwohl ja alles ganz korrekt war. Ab und zu ist es einfach wirklich keine gute Idee an einem Freitagabend zu arbeiten, wobei ich ja normalerweise spät abends immer die besten Ideen habe und auch sehr produktiv sein kann. Nicht aber gestern. Aber was war eigentlich passiert?

Für ein Projekt in der Uni musste ich ein Datenbankschema entwerfen. Genauer gesagt gab es schon eines, das von meinen Teammitgliedern zusammen gestellt wurde. Da jeder hier eine eigene Art und Weise hat, wie er Tabellen und Spalten benennt und wir es versäumt hatten dafür Coding-Guidelines aufzustellen, resultierte das natürlich in einem Chaos. Also habe ich mich erst einmal daran gemacht alle Tabellen nach und nach zu vereinheitlichen.

Neben geänderten Tabellen und Spaltennamen, musste ich auch so manchen Spaltentyp ändern. So gingen einige mit dem Speicherplatz sehr verschwenderisch um und andere nutzen VARCHAR-Spalten für Zahlenwerte, die gleichzeitig als Schlüssel dienten.

Nachdem ich nun endlich aufgeräumt hatte, fügte ich in einige Tabellen ein paar Testwerte ein. Anschließend wollte ich einen einfachen JOIN über eine m:n Beziehung machen. Also schrieb ich ein einfaches Statement nach folgendem Schema:

SELECT	*
FROM 		tabelle1 AS t1
JOIN		tabelle1_tabelle2 AS t1_t2 ON t1.id = t1_t2.tabelle1_id
JOIN		tabelle2 AS t2 ON t1_t2.tabelle2_id = t2.id

In der Verknüpfungstabelle gab es genau zwei Verknüpfungen, die jeweils die IDs 1 und 2 der beiden Tabellen miteinander verknüpften. Man erwartet also nun, dass zwei Ergebniszeilen bei einer Abfrage ausgegeben werden. Das Ergebnis waren aber 0 Zeilen. Anschließend versuchte ich es mit einem LEFT JOIN, aber auch hier gab es kein Ergebnis.

Mein Verdacht war dann, dass es sich um irgendeinen Fehler mit der Datenbank oder der Tabelle handelt. Daher erstellte ich eine neue Datenbank und jeder Tabelle nochmals von neuem. Anschließend importierte ich die Datensätze der alten Tabelle in die neue. Das Ergebnis war aber noch immer leer. In meiner Verzweiflung änderte ich Kodierungen hin und her, erstellte und löschte Indizes benannte Tabellen und Spalten um, aber nichts half. Also tat ich das, was jeder an dieser Stelle tun sollte: Ich ging schlafen. Ich war mir sicher, am nächsten Tag würde ich drauf schauen und mich wundern, wieso ich das nicht direkt gesehen habe.

Heute Abend ging es dann erneut an das Problem. Zuerst versuchte ich wieder einige Taktiken von gestern, die selbstverständlich auch heute nicht funktionieren. Aber dann fing ich noch einmal von vorne an. Ich erstellte nur diese drei Tabellen und in den beiden zu verknüpfenden gab es nur die Felder id und name. Jetzt fügte ich noch in beide Tabellen jeweils 2 Datensätze ein, sowie jeweils eine Verknüpfung in die Verknüpfungstabelle. Und siehe da, mein Statement funktioniert. Von diesem Stand machte ich nun einen Dump.

Anschließend ersetzte ich zuerst die tabelle2 mit der originalen. Auch jetzt funktionierte noch alles. Dann ersetze ich die tabelle1 mit der originalen und fügte diesmal keine alten, sondern neue Werte ein. Zuerst funktionierte das Statement wieder nicht. Dann machte ich hiervon einen Dump und verglich die beiden Dumps miteinander. Dabei viel mir dann auch der Fehler auf. Da die Spalte id ein AUTO_INCREMENT war, gab es nun keine IDs mit den Werten 1 und 2 mehr und somit auch keine Zuordnung.

Mit dieser Erkenntnis ging es dann an meine originale Datenbank. Und auch hier war das gleiche Problem. Die IDs starteten bei 3 und es konnte somit keine Verknüpfung geben. Da ich die zuvor leere Tabelle mit Werten gefüllt hatte, ging ich davon aus, dass ich auch die IDs 1 und 2 in der Tabelle haben werde. Aber da der Ersteller der ursprünglichen Tabelle anscheinend schon einmal zwei Testdatensätze in die Tabelle eingefügt hatte, war der AUTO_INCREMENT Wert bereits auf 3 erhöht worden. Und durch die Dumps habe ich natürlich auch immer diesen Wert sowie die zu hohen IDs mit kopiert.

Und die Moral von der Geschichte: Freitagabends sollte man bei solchen Problemen lieber früher als später eine Pause machen, damit einem nicht wie mir der Kopf irgendwann streikt. Am besten holt man sich jemanden dazu, der den eigenen Code nicht kennt, denn der sieht den Fehler direkt. Und wenn man selbst nach der Lösung suchen muss, sollte man sich schrittweise dem Problem nähern. Denn gerade bei diesen „Man sieht den Wald vor lauter Bäumen nicht mehr“ kann man tausende male auf die falsche Stelle sehen, man wird den Fehler nicht finden.

Ich bin mir sicher, dass jeder von euch schon einmal eine ähnliche Situation erlebt hat. Ich würde mich also über einen witzigen Kommentar dazu sehr freuen.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.