Moin!
ich würde ganz gern wissen wie ich in mysql den wert einer autoincrement spalte herausfinde, den ein neuer datensatz bekommen würde _bevor_ ich etwas in die datenbank schreibe, bzw. ohne das ich auch danach etwas hineinschreibe....
Ich habe über Google folgende Diskussion gefunden: http://www.phpbuilder.com/board/showthread.php?threadid=10209766
Die dort gestellte Frage will ich auch dir stellen: Wozu brauchst du das?
Und diese Frage ist durchaus berechtigt, weil davon die Lösung abhängen wird: Entweder geht es, oder es ist Unsinn. Meine derzeitige Meinung tendiert aber zum Unsinn.
Begründung: Das Web ist benutzer-parallel. Es ist also nicht auszuschließen, dass zwei oder mehr Benutzer gleichzeitig die von dir gewünschte Information angezeigt bekommen.
Wenn man sich dieses Szenario durchdenkt, dann kann die Ausgabe der nächsten zu erzeugenden Autoincrement-ID nur bei einem der Benutzer korrekt sein, wenn der weitere Verlauf dazu führt, dass diese ID wirklich benutzt wird. Denn es wäre ja eine Katastrophe, wenn drei Benutzer angezeigt kriegen würden, die nächste ID sei 23, und alle geben dann Daten für diesen Datensatz ein und überschreiben sich beim Speichern gegenseitig.
Ebenso ist es bei solch einem Szenario dann natürlich unsinnig, über ungelegte Eier bzw. Datensätze zu gackern: Nur der, der zuerst speichert, speichert wirklich Datensatz 23 - die anderen beiden speichern Nr. 24 und 25, ohne es vorher zu wissen.
Die im obigen Thread angesprochene Methode, im Single-User-Kontext einen blinden Datensatz anzulegen, der dann logischerweise eine "nächste ID" erhält und dann exklusiv für diesen Benutzer vergeben wird, erscheint mir da sinnvoller. Denn so legt Benutzer 1 den Datensatz 23 an und kann ihn bearbeiten, weitere Benutzer legen Datensatz 24, 25 etc. an. Die einzelne Benutzersession weiß, welcher Datensatz angelegt wurde und kann die eingegebenen Daten dann problemlos speichern. Ja, die Sicherheit vor Manipulationen der Datensatz-ID wäre noch zu klären, aber prinzipiell geht das so. Was allerdings passiert, wenn der Benutzer keinen Datensatz anlegt, wäre noch zu klären. Ohne Benutzerverwaltung, Statuscodes im Datensatz und/oder irgendein Session-Management wird es nicht gehen.
Übrigens: @@IDENTITY macht bei MSSQL genau das, was LAST_INSERT_ID() in MySQL macht. Sicherlich gibts eine Möglichkeit, doch irgendwie den aktuellen Zählerstand herauszufinden (MySQL muß den Wert ja irgendwo verwalten), aber das wäre weitab von vernünftigem SQL und vernünftigem Datenbankdesign.
Zitat von http://www.webmasterworld.com/forum13/1348.htm
I downloaded the SQL server books from msdn and found this description of @@IDENTITY
"After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated."
Mit anderen Worten: @@IDENTITY gibt dir nur dann einen Wert, wenn durch das SQL-Statement vorher eine ID automatisch generiert wurde, sonst nicht. Und das ist eben immer der Fall, wenn du eine Datenbankverbindung neu herstellst. LAST_INSERT_ID() arbeitet verbindungsbezogen.
- Sven Rautenberg
Signatur oder nicht Signatur - das ist hier die Frage!