mySQL: Wie gerade erzeugten Datensatz lesen?

Moin,

ich habe eine Tabelle mit einem Feld „ID“, das automatisch hochgezählt wird und den Primärschlüssel darstellt. Nun habe ich ein Problem entdeckt:

Ich lege in einer Aktion einen neuen Datensatz an, den ich in einer anderen mit Daten füllen will. Aber wie komme ich an die ID des eben angelegten Datensatzen heran, um ihn zwecks Befüllung wieder identifizieren zu können?

Also nochmal anders formuliert:

Ich machen ein INSERT, weiß aber nicht, welche ID vergeben wurdem kann also nicht mittels UPDATE … WHERE ID=xyz die Daten eingeben.

Weiß jemand Rat? Ich dachte erst, dass man über die zurückgelieferte Ressource ($res = mysql_query(…)) da rankommt, aber ich habe keine passende PHP-Funktion dafür gefunden. Und mySQL scheint auch nichts bereitzustellen (INSERT … SELECT klang erst danach, ist aber was ganz anderes).

Würde mich freuen, wenn jemand einen Tip hätte. Denn sonst habe ich keine Ahnung, wie ich das anstellen soll.

Kristian

Hallo Kristian,

Ich lege in einer Aktion einen neuen Datensatz an, den ich in
einer anderen mit Daten füllen will. Aber wie komme ich an die
ID des eben angelegten Datensatzen heran, um ihn zwecks
Befüllung wieder identifizieren zu können?

Zwei Möglichkeiten:

  1. Du verzichtest auf das Autoincrement und suchst Dir die ID mit einer IFNULL(MAX(id)+1, 1) - Selektion.

    SELECT IFNULL(MAX(id)+1, 1)
    FROM table

Das ist zwar ein Select mehr, aber Du musst beispielsweise den Zähler nicht zurücksetzen, wenn Du einen DS löschst, und verhinderst größtenteils Löcher. Durch einen Join der Tabelle mit sich selbst kannst Du auch die niedrigste freie ID herausfinden. Dann hast Du bereits die ID in einer Variable.

SELECT IFNULL(a.id+1, 1) AS nextid 
FROM table a LEFT JOIN table b ON a.id+1 = b.id
WHERE b.id IS NULL 
ORDER BY a.id;
  1. Du behältst das Autoincrement und verwendest die PHP-Funktion mysql_insert_id, welche Dir die ID des letzten Inserts zurückgibt.

http://it.php.net/manual/de/function.mysql-insert-id…

Schönen Gruß,
Rudy

Hallo Rudy,

ich werde mir die beiden Sachen mal anschauen, danke. Allerdings bin ich mir nicht ganz sicher, ob sie robust sind. Ich hatte nämlich vergessen zu erwähnen, dass man von mehreren Clients aus auf die Datenbank zugreifen kann, im worst case also zwei oder drei Porzesse gleichzeitig einen Datenansatz anlegen (klar, eine echte Gleichzeitigkeit gibt´s da nicht, aber es ist klar, worum´s geht). Wenn ich nur einen Client hätte, wäre es kein Problem, dann gäbe es verschiedene Krücken, um das zu realisieren.

Aber vielleicht geht das ja mit der zweiten Möglichkeit doch. Mal gucken. Ich schaue erstmal in Deinen Link rein.

Danke und schönen Sonntag noch,
Kristian

Hallo,

die zweite Möglichkeit, die dir genannt wurde, ist an die aktuelle Connection gebunden. Das macht keine Probleme bei gleichzeitigem Zugriff anderer Clients.

Daniel

Stimmt, hab´s gerade auch erkannt. Danke. - o.w.T.
o.w.T.