Archiv für die Kategorie ‘MySQL Tipps’

Zeichenketten oder Felderwerte mit MySQL CONCAT verknüpfen/verketten

Mittwoch, 02. November 2011

MySQL ist eine mächtige Sprache, die sehr oft PHP Programmierern sehr viel Arbeit abnehmen kann. Dies gilt für diverse Berechnungen, die manchmal mit PHP langsamer erledigt werden können, denn es sind weitere Programmierschritte notwendig. Heute werden wir betrachten wir verschiedene MySQL Felderwerte mit weiteren Feldern oder Zeichenketten verknüpft werden können. Dies hilft uns direkte und fertige Werte für unsere PHP Programmierung bereit zu halten oder diverse Sortier- oder Gruppieraktionen durchzuführen.

Problematik

Betrachten wir eine MySQL Tabelle USERS mit folgenden Feldern: ID, Vorname, Nachname. Nun sehen wir wie wir einen kompletten Namen direkt von MySQL erhalten können.

Lösung

SELECT CONCAT(Vorname,Nachname) as Vollname FROM USERS ORDER BY Vollname

Wir haben soeben mit MySQL die Tabelle so abgefragt, dass wir ein Ergebnis mit lediglich einer Spalte bekommen – Vollname. Diese Spalte würde für Werte Thomas und Müller folgenden Wert enthalten – ThomasMüller. Dies ist aber kein korrektes Format, in diesem Fall für einen Namen. Nun können wir die Abfrage so erweitern:

SELECT CONCAT(Vorname,' ',Nachname) as Vollname FROM USERS ORDER BY Vollname

Wir haben eine Zeichenkette noch dazu durch MySQL verknüpfen lassen. Hiermit bekämen wir Thomas Müller.

Fazit

Es gibt zwei sehr interessante und nützliche Aspekte zu diesem Thema:

  • Sie können so viele Felder und/oder Zeichenketten verbinden, wie Sie wollen
  • Sie können beliebige Trenn- oder andere Zeichen verketten. Diese müssen Sie einfach mit einem Komma trennen

Brauchen Sie professionelle Hilfe für Ihre Programmierungen oder MySQL Abfragen? Wir sind für Sie da – zögern Sie nicht mit uns per E-Mail oder telefonisch – 02161 / 177747 – Kontakt aufzunehmen.

Ermitteln vom nächsten AutoIndex Wert einer MySQL Tabelle mit auto_increment Feldern

Dienstag, 25. Januar 2011

Wie wir schon bei unserem letzten sich über MySQL beziehenden Artikel MySQL – nächster AutoIndex zurücksetzen/resetten erläutert haben, ist der AutoIndex ganz wichtig wenn man oft Datensätzen einfügt und dann wieder löscht, denn MySQL lässt keine Werte in auto_increment Felder wieder vorkommen, es sei denn man setzt den AutoIndex-Wert auf den kleinstmöglichen Wert zurück. Der minimale Wert kann ja in der Regel die größte momentan vergebene auto_increment ID + 1. Die Lösung die wir hier in diesem Artikel betrachten werden, bezieht sich darauf wie man den nächsten zu vergebenden auto_increment Wert abrufen kann.

Problemstellung

Wir sind über das Problem gestolpert, als es für uns wichtig wurde, die IDs von Datensätzen vor dem Einfügen zu ermitteln. Dies könnte dazu dienen, beispielsweise in einer Buchhaltungsroutine, eingegebene Kassenbelege mit IDs in einer Datenbank zu verknüpfen, um später Kassenbestände eindeutig identifizieren zu können, insbesondere wenn man die Kasse elektronisch aufführen möchte. Hierzu kommt MySQL mit einer Abfrage zur Hilfe.

Lösung

Um den nächsten AutoIndex Wert zu bekommen, müsste man folgende Abfrage ausführen:

SHOW TABLE STATUS LIKE `IhreTabelle`

Zurückgegeben von MySQL (natürlich bei existierender mit diesem Namen Tabelle) wird eine Zeile mit vielen Werten, die unter anderem Kollation, Kodierung, Datum der letzten Änderung und sonstige beinhaltet. Was wir hier auslesen müssen ist der Wert in der Spalte Auto_increment, die unseren Wert beinhaltet. Diesen können Sie beispielsweise mit PHP einfach auslesen. Wenn Sie da nicht selber weiterkommen, so können Sie sich mit uns in Verbindung setzen.use-web

Problematik

Natürlich gibt es verschiedene Punkte, die man berücksichtigen muss:

  • Häufige Tabellennutzung – falls die Tabelle, wo Sie Ihre Datensätze einfügen von mehreren (beispielsweise Buchhaltern) benutzt wird, so kann es sein, dass sich der nächste AutoIndex ändert nachdem Sie die Ausgabe von der obigen Abfrage sehen und bevor Sie auf Speichern klicken, denn diese ID könnte jemandem anders schon vergeben worden sein.
  • Syntax der Abfrage – vergessen Sie nie den Tabellennamen in den Apostrophen zu umfassen – ` … `, denn ansonsten wird ein Tabellennamen mit Bindestrich nicht angenommen
  • Unnötiggröße Werte – vergessen Sie nie den AutoIndex zurückzusetzten immer, wenn Sie eine Gelegenheit haben, um nicht eine Felddefinitionsgrenze nicht zu erreichen. Dies haben haben wir in unserem anderen Artikel beschrieben.

 Bei Fragen stehen wir Ihnen jederzeit zur Verfügung. Viel Spass und beachten Sie bitte unsere anderen MySQL Artikel!

MySQL – nächster AutoIndex zurücksetzen/resetten bevor INSERT INTO

Dienstag, 07. Dezember 2010

Bestimmt kommt der Tag, wo Sie Massenimports mit MySQL vornehmen werden. Diese Imports können dazu führen, dass Sie große Mengen an Datensätzen per INSERT INTO einfügen. Für Tabellen mit einem klassischen ID Feld mit auto_increment kann das mittel- bis langfristig ein großes Problem werden, denn der maximale Wert dieser ID Spalte kann über kurz oder lang überschritten werden. Dann können Sie nicht mehr einfügen. Woran liegt das?

Problemstellung

Wenn Sie eine MySQL Tabelle mit einer ID Spalte anlegen, die im Normalfall den Attribut auto_increment hat, wird durch das MySQL Engine sichergestellt, dass beim Einfügen eine bereits benutzte ID nie wieder benutzt wird, sondern es wird immer die nächste freie direkt angenommen. Allerdings wenn Sie Datensätze löschen, wird die nächste freie ID weiterhin so generiert, als hätten Sie nichts gelöscht. Beispielsweise fügen Sie 200 Datensätze ein, beim INSERT INTO vom Datensatz 201 wird der nächste AutoIndex automatisch auf 202 gesetzt. Jetzt gehen Sie hin und löschen 100 Datensätze, so dass es nur 100 Datensätze in der Tabelle gibt. Wenn Sie nun versuchen einzufügen, so bekommt der Datensatz 101 die ID 202. MySQL reserviert die bereits vergebene IDs und vergibt diese nie wieder.

Wenn Sie tägilch per Import 1000 Datensätze löschen und dann wieder importieren, so bekommen Sie innerhalb von 30 Tagen eine ID von 30.000. Bald werden Sie auf BIGINT umstellen müssen, was nicht gerade prickelnd ist. Das Problem ist aber, dass die Programmierer fast immer diesen Aspekt vergessen und irgendwann funktioniert der INSERT INTO nicht mehr. Was kann man machen?

Lösung 1 – TRUNCATE TABLE

Angenommen Sie machen Ihren Import komplett in einer Tabelle, die nicht für weitere Zwecke benutzt wird. Dann können Sie die Tabelle komplett leer machen mittels folgender Abfrage:

TRUNCATE TABLE ´IhreTabelle´

Mit diesem Befehl wird der AutoIndex auf 1 gesetzt/resettet und Sie können ruhig alle aktuellen Datensätze importieren. Was tun aber wenn Sie weitere Daten in der Tabelle haben, die Sie gerne behalten möchten? Vor allem können Sie sich ja nicht leisten mit einmal komplett neue IDs der bestehenden Datensätzen zu vergeben, denn diese können sich auf Fremdschlüssel beziehen.

Lösung 2- Next AutoIndex zurücksetzen

Sie können MySQL dazu zwingen, den nächstmöglichen AutoIndex zu nehmen, der sich aus der Anzahl der Zeilen bzw. die bisher maximale sich in der Tabelle befindende ID bezieht. Dazu führen Sie die folgende MySQL Abfrage aus:

ALTER TABLE ´IhreTabelle´AUTO_INCREMENT=1

Und damit haben Sie gewonnen! Solche Programmierlösungen sind auch besonders wichtig für Fälle, wo Sie mehrere unterschiedliche Imports aus unterschiedlichen Quellen machen.