mysql id autoincrement
MArco
- datenbank
Hallo
Ich hab eine MySql Datenbank die per PHP gefüllt wird. Die Datensätze werden eindeutig identifiziert durch das Feld "id"
Das Feld hat den Primärschlüssel und ist auf Autoincrement. Das ist auch ganz gut und es funktionier ganz gut. Bloß wenn ich manche Datensätze lösche dann löscht sich aber nicht der Wert des AutoIncrement also wenn ich 3 Datensätze hab und den letzen lösche und nen neuen rein tu, dann hat er im Feld "id" den Wert 4, ich will aber das er am letzen weiter macht also wieder einen Datensatz mit id=3 anlegt..gibts da nen Befehl wie ich diesen Autoincrement Wert auf ne bestimmte Zahl legen kann? mein PHP Code ist so gemacht das er nicht richtig funktioniert wenn da "Lücken" dazuschen sind. Muss ich dann meinen Code überarbeiten und kann ich da was in der Datenbank machen??
THX
Hi!
In MySQL ist das nicht möglich, auch nicht erwünscht, siehe http://www.dclp-faq.de/q/q-sql-ids.html.
Du mußt Dein Programm so umschreiben das es diese Information anders ermittlet, halt in PHP.
Grüße
Andreas
Füge Deiner Tabelle eine weitere Spalte "geloescht" hinzu.
Wenn Du einen Datensätz nicht mehr benötigst, setze den Wert in der Spalte "geloescht" von z.B. 1 auf 0 (per UPDATE).
So entstehen Dir keine Lücken.
Moin!
Ich hab eine MySql Datenbank die per PHP gefüllt wird. Die Datensätze werden eindeutig identifiziert durch das Feld "id"
Das Feld hat den Primärschlüssel und ist auf Autoincrement. Das ist auch ganz gut und es funktionier ganz gut. Bloß wenn ich manche Datensätze lösche dann löscht sich aber nicht der Wert des AutoIncrement also wenn ich 3 Datensätze hab und den letzen lösche und nen neuen rein tu, dann hat er im Feld "id" den Wert 4, ich will aber das er am letzen weiter macht also wieder einen Datensatz mit id=3 anlegt..gibts da nen Befehl wie ich diesen Autoincrement Wert auf ne bestimmte Zahl legen kann? mein PHP Code ist so gemacht das er nicht richtig funktioniert wenn da "Lücken" dazuschen sind. Muss ich dann meinen Code überarbeiten und kann ich da was in der Datenbank machen??
Diese Frage entwickelt sich ja richtig zum Renner - quasi die 2-Frames-Frage im Segment Datenbanken. Ich glaube, jemand (<I> droht) sollte dazu mal einen Tipps&Tricks-Artikel schreiben... ;)
Ok, also nochmal die Langfassung:
Warum ist es nicht gut, die ID eines Datensatzes zu ändern?
Folgendes Szenario wäre denkbar: Du hast deine Datenbankanwendung geschrieben und arbeitest gerade an einem Datensatz (den mit der Nummer 23). Du stellst fest, dass er möglicherweise geändert werden muss, weißt es aber noch nicht genau. Das mußt du nachgucken/jemanden fragen/irgendwie warten - egal, jedenfalls entschließt du dich, die Eingabemaske erstmal offen zu lassen, damit du später schnell drauf zugreifen kannst, und machst in einem neuen Browserfenster weiter.
Dann entdeckst du, dass Datensatz 21 gelöscht werden muss. Das tust du. Beim Löschen werden alle IDs umnumeriert. Das bedeutet: Aus Datensatz 23 wird jetzt Datensatz 22, und aus Datensatz 24 wird Datensatz 23.
Schließlich kriegst du die geänderten Daten zu deinem Datensatz 23 in der Eingabemaske. Und dein Skript hat in einem versteckten INPUT-Feld natürlich die ID gespeichert, damit das UPDATE auch weiß, welcher Datensatz gemeint ist. Nur dummerweise hast du ja zwischenzeitlich einen Datensatz gelöscht, von dem die Eingabemaske nichts mitgekriegt hat. D.h. eigentlich hättest du ID 22 ändern müssen - jetzt werden die Daten vom falschen Datensatz 23 (ex-24) geändert - möglicherweise überschreibst du die Daten des Datensatzes komplett, also ist der Ex-24-jetzt-23-Datensatz komplett verloren - stattdessen hast du einen veralteten Ex-23-jetzt-22-Datensatz und einen neuen, aktuellen Datensatz 23, der so nie vorgesehen war.
Deshalb:
Beim INSERT eines Datensatzes vergibt die Datenbank eine eindeutige ID. Diese ID wird _niemals_ angetastet. Sie ist ein immer, _immer_, IMMER gültiges Merkmal, um den Datensatz eindeutig zu identifizieren. Und wenn der Datensatz gelöscht wird, wird die ID niemals wieder vergeben, denn sonst könnten Verknüpfungen zum alten, gelöschten Datensatz, die über die ID gehen, nicht als ungültig erkannt werden, wenn die ID neu belegt werden würde.
- Sven Rautenberg