FinalFantasy Geschrieben 20. September 2004 Teilen Geschrieben 20. September 2004 Ich habe hier eine Datenbanktabelle, in diese will ich in einer PHP-Schleife bis zu 5 Inserts machen. Die Inserts sehen etwa so aus: INSERT INTO tab VALUES (LAST_INSERT_ID(), ...) Das Problem ist das LAST_INSERT_ID(). Das Insert im ersten Schleifendurchlauf wir korrekt in die Datenbank geschrieben. Bei allen folgenden bekomme ich den Fehler, dass der Primary Key (welcher durch das LAST_INSERT_ID() angegeben wird) schon in der Tabelle vorhanden ist. Die Frage ist jetzt, wie, bzw, wann wird LAST_INSERT_ID weitergezählt? Ich habe schon versucht, jedes Insert mit einem Commit Work abzuschliessen, aber das hilft auch nicht. Anscheinend wird die LAST_INSERT_ID nicht bei jedem Insert hochgezählt, weil folgendes Konstrukt ja auch funkioniert: INSERT INTO tab VALUES (LAST_INSERT_ID()...) SELECT id FROM tab WHERE key = LAST_INSERT_ID Damit bekomme ich den Key des letzten Eintrags zurück, also den, der durch LAST_INSERT_ID geschrieben wurde, die ID kann also beim anschliessenden SELECT noch nicht hochgezählt sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 20. September 2004 Teilen Geschrieben 20. September 2004 Das Problem ist das LAST_INSERT_ID(). Das Insert im ersten Schleifendurchlauf wir korrekt in die Datenbank geschrieben. Bei allen folgenden bekomme ich den Fehler, dass der Primary Key (welcher durch das LAST_INSERT_ID() angegeben wird) schon in der Tabelle vorhanden ist. Ich gehe davon aus, dein Feld ist ein Auto_Increment Feld. LAST_INSERT_ID liefert den zuletzt vergebenen AutoInc Wert zurück, vergibt allerdings keinen neuen. INSERT INTO Tabelle VALUES (NULL, ...) hilft dir dabei. siehe http://dev.mysql.com/doc/mysql/en/Getting_unique_ID.html When a new AUTO_INCREMENT value has been generated, you can also obtain it by executing a SELECT LAST_INSERT_ID() statement mysql_query() and retrieving the value from the result set returned by the statement. For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It will not be changed by another client. It will not even be changed if you update another AUTO_INCREMENT column with a non-magic value (that is, a value that is not NULL and not 0). oder http://dev.mysql.com/doc/mysql/en/ODBC_and_last_insert_id.html Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 20. September 2004 Autor Teilen Geschrieben 20. September 2004 Also wird das Auto_increment Feld (ja es ist eins) bei INSERT INTO tab VALUES (NULL,...) hochgezählt?? Dann versteh ich aber nicht, wieso INSERT INTO tab VALUES (LAST_INSERT_ID(),...) funktioniert? Das müsste doch dann generell einen Fehler bringen, weil der letzte Index ja scho vergeben ist und ich somit IMMER einen doppelten primary Key hätte. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 20. September 2004 Teilen Geschrieben 20. September 2004 Also wird das Auto_increment Feld (ja es ist eins) bei INSERT INTO tab VALUES (NULL,...) hochgezählt?? Ja, zum Rest kann ich dir nichts sagen. Hab das selber das erste mal so gesehen (bei dir). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 20. September 2004 Teilen Geschrieben 20. September 2004 du kannst auch einfach anstatt mit VALUES, dann mit SET arbeiten INSERT INTO tab SET name ='abc', position=15 Dadurch das du dann im SET-Clause keinen expliziten Wert für die ID angibts und diese eine AutoIncrement Column ist, würde er dir automatisch eine fortlaufende zahl einfügen Du kannst übrigens auch in PHP die Last insert ID herausfinden: @see http://de3.php.net/manual/en/function.mysql-insert-id.php Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.