• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Maximalwert ermitteln

Tomm

Mitglied
Wie kann ich in meiner Datenbank mysql den maximalen Wert von 'id' ermitteln

id ist der Primärschlüssel und wird autoinkrementiert,erhöht sich um eins bei jedem neuen Eintrag

wie kann man nun den id vom letzten Eintrag ermitteln ?
 
Ja,Danke
...funktioniert....

PHP:
$query = mysql_query("SELECT MAX(id) FROM meine_tabelle");
  $max_id = mysql_result($query,0);

die nächste id ist dann einfach $max_id+1
 
Achtung: MAX(id) ist nicht dafür geeignet, die ID des gerade erzeugten Datensatzes zu ermitteln, um sie als Fremdschlüssel in einem weiteren INSERT verwenden zu können.

Es kann – ohne Einsatz von Transaktionen jedenfalls – nicht ausgeschlossen werden, dass ein weiterer Datensatz in der Zeit eingefügt wird, die zwischen der INSERT- und der SELECT MAX(id)-Abfrage liegt.

Die ID des zuletzt eingefügten Datensatzes der eigenen Verbindung (das ist in 99,99 % der Fälle die, die gesucht wird) liefert dagegen LAST_INSERT_ID(). Beim mysql-Adapter geht der Abruf über – na klar – mysql_insert_id.

@ka9de: Das GROUP BY ist schon etwas gruselig, oder? ;)
 
Haken, man sollte vorher ein INSERT ausgeführt haben...
mysql_insert_id() liefert 0, wenn die vorhergehende Abfrage keinen AUTO_INCREMENT Wert erzeugt hat. Falls Sie den Wert zur späteren Verwendung speichern möchten, stellen Sie sicher, dass Sie mysql_insert_id() direkt nach der Abfrage aufrufen, die einen Wert erzeugt hat

Max() ist daher garnicht so blöd, sollte aber unbedingt VOR dem neuen INSERT nochmal abgefragt werden.
Bei einem auto increment ist die Übergabe einer ID ja garnicht notwendig und max kann ignoriert werden.
 
ich möchte die id vor dem INSERT ermitteln,weil ich den Bildern dann im Dateinamen auch die id dranhänge.
So kann ich schnell erkennen,welches Bild zu welcher id gehört.
 
Auch wenn eine Race Condition in vielen Fällen sehr unwahrscheinlich sein mag: MAX(id) ist – zumindest außerhalb einer Transaktion – falsch. Daran gibt es nichts zu rütteln.
 
Zuletzt bearbeitet:
Es entsteht der Eindruck, dass mysql_insert_id immer funktionieren würde, so ist das aber nicht.

Ich stimme zu, wenn ich die ID setze, in diesem Fall (Primärschlüssel) ist es eine auto increment id, ich übergebe sie also nicht, wenn ich einen neuen Datensatz generiere, somit ist eine Race Condition unmöglich.
Will man die letzte ID VOR einem insert finden, hilft einem mysql_insert_id() nicht und gibt 0 zurück (Browser öffnen und die letzte verwendete ID finden). Dann geht es nur mit MAX(). Das mag von miraus auch von der Datenbank version abhängen, hier bei mir geht es nicht.

Wenn du ein Bild einem Datensatz zuordnen möchtest, brauchst du die ID des Datensatzes, nicht die letzte verwendete. Geht dem Bildupload ein insert voraus (sprich du legst einen neuen Datensatz an und weist dann die Bilder zu) kannst du mysql_insert_id() ja verwenden.
 
Mit mysql_insert_id müsstest du [das allgemeine Du ;)] erst ein INSERT machen und dann noch ein UPDATE hinterher, um die ID nachträglich in ein Feld im Datensatz einzufügen, ja.

(Ich hege mittlerweile übrigens den leisen Verdacht, dass es nicht sinnvoll ist, die ID in einem weiteren Feld des Datensatzes zu speichern. Denn wenn du den Datensatz ausliest, hast du die ID so oder so. Aber egal.)

Will man die letzte ID VOR einem insert finden, hilft einem mysql_insert_id() nicht und gibt 0 zurück (Browser öffnen und die letzte verwendete ID finden). Dann geht es nur mit MAX(). Das mag von miraus auch von der Datenbank version abhängen, hier bei mir geht es nicht.

Das geht wohl einfach prinzipiell nicht.

- mysql - How to get the id of an inserted row ON insert? - Stack Overflow

Bei MAX() hast du wie erwähnt die Gefahr von Race Conditions. Das müsste innerhalb einer Transaktion zwar theoretisch funktionieren, aber das habe ich nie getestet. (Würde ich auch nicht empfehlen, weil ich es gedanklich für ziemlich krude halte. Index-„Generierung“ beziehungsweise „-Hellseherei“ hat meiner Meinung nach in PHP nichts verloren.)

Wenn du ein Bild einem Datensatz zuordnen möchtest, brauchst du die ID des Datensatzes, nicht die letzte verwendete. Geht dem Bildupload ein insert voraus (sprich du legst einen neuen Datensatz an und weist dann die Bilder zu) kannst du mysql_insert_id() ja verwenden.

Umgekehrt geht meines Erachtens überhaupt nicht.[1] Wenn du erst das Bild erstellst (mit MAX(ID)+1 = 1462, meinetwegen 1462.jpg), besteht sozusagen keine Chance, den zugehörigen Datensatz garantiert mit ID 1462 in die DB zu bekommen. Zwischen dem Kopieren des Bildes und den SQL-Queries können x andere Requests durchrauschen.



[1] Vielleicht mit Triggern oder so.
 
Genau so ist es, wieder einmal auf den Punkt gebracht.

Das Problem ist übrigens ein generelles, viele Programmierer haben dafür schon verschiedenste Lösungen gesucht.
Max() ist nur dann zweckmässig, wenn man die letzte verwendete ID herausfinden will ohne sie weiter verarbeiten zu wollen (ein Hinweis, die letzte ID ist: xxx wie es z.B. in phpmyadmin gemacht wird).

Ich verstehe den Drang, die ID dem Bild zu hinterlegen auch nicht, dazu könnte man beim Datensatz z.B. den Pfad abspeichern oder (wie ich es bevorzuge) ein eigenes Verzeichnis mit der ID erstellen und die Bilder dort ablegen, was den Vorteil hat, dass man mit einem read() alle Daten auf einmal auslesen kann.
PHP:
function echodir($path, $sort=1)
{
   if(!file_exists($path))
   {
      return FALSE;
   }

   $dir = dir($path);

   while(false !== ($file = $dir->read()))
   {
      if(("."  == $file) OR (".." == $file) or (stristr($file,".ht")))
      {
         continue;
      }
      else
      {
         $check[] = $file;
      }
   }
   $dir->close();
   
   if($sort == 1)
   {
       sort($check);
   }
   return $check;
}
 
Warum nicht eine eindeutige My-Id erstellen (wie uhrzeit+session id), die im Datensatz speichern und im Datensatz zusätzlich einen autoincrement Key-Idverwenden. Dann über die My-Id die erstellte Key-Id auslesen und über die die Bildnamen vergeben. Im schlimmsten Fehlerfall beim Speichern der Bilder hat man ein paar in der Luft hängende Datensätze und zusätzlich hat man nur die eigentlich unnötige My-Id. Warum die Id allerdings unbedingt fortlaufend sein soll ist allerdings unklar :-). OK, sieht schöner aus, wenn man keine löscht ;-).
 
Zurück
Oben