auto_increment oder ?
homer
- datenbank
AUTO_INCREMENT erhöht den Wert eines Feldes nach einfügen eines neuen
Datensatzes um 1. Beim löschen eines Datensatzes steht der Feldwert wieder
zur Verfügung und wird ein neuer Datensatz eingefügt wird er an der Stelle
des zuvor gelöschten Datensatzes eingefügt.
Ich möchte aber, dass wenn ein Datensatz gelöscht wird z.B. mit dem Feldwert
3, dass der Feldwert des folgende Datensatzes nicht mehr 4 ist, sondern 3
und bei einfügen eines neuen Datensatzes er an das Ende der Tabelle angefügt
wird.
CREATE TABLE TableName (
Projekt_Nr BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY...
Was muss ich hier ändern ?
AUTO_INCREMENT erhöht den Wert eines Feldes nach einfügen eines neuen
Datensatzes um 1. Beim löschen eines Datensatzes steht der Feldwert wieder
zur Verfügung und wird ein neuer Datensatz eingefügt wird er an der Stelle
des zuvor gelöschten Datensatzes eingefügt.
Ich möchte aber, dass wenn ein Datensatz gelöscht wird z.B. mit dem Feldwert
3, dass der Feldwert des folgende Datensatzes nicht mehr 4 ist, sondern 3
und bei einfügen eines neuen Datensatzes er an das Ende der Tabelle angefügt
wird.
CREATE TABLE TableName (
Projekt_Nr BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY...
Was muss ich hier ändern ?
Das laesst sich nicht fest so festlegen (leider). Das hat technische Gruende da auto increment felder generell als key definiert sind. Somit muesste bei jedem delete der index neu erstellt werden. Das waere bei starker belastung fatal fuer die performance. Allerdings kannst du auch auto_increment felder modifizieren, was dir allerdings nicht viel bringt. Weitere moeglichkeit waere es alle dateneintraege zu dumpen, die tabelle zu optimieren und dann wieder zu schreiben :)
Ingo Bartel
Hi Ingo,
auto increment felder generell als key definiert sind.
Somit muesste bei jedem delete der index neu erstellt werden.
Wie kommst Du auf diese Idee?
Wieso soll die Verwendung eines Index einen Unterschied zwischen INSERT
und DELETE nach sich ziehen? In beiden Fällen muß im Indexbaum im Wesent-
lichen _ein_ Datensatz angepaßt werden.
Das waere bei starker belastung fatal fuer die performance.
Richtig. Deshalb ist es sinnvollerweise auch nicht so implementiert.
Viele Grüße
Michael
Vielen Dank für die Antworten!
Das beste wird es wohl sein die Ausgabe der Tabelle so zu gestalten,
dass sie nach der "auto_increment Nummer" sortiert.
Hallo!
Ich möchte aber, dass wenn ein Datensatz gelöscht wird z.B. mit dem Feldwert
3, dass der Feldwert des folgende Datensatzes nicht mehr 4 ist, sondern 3
Dies kannst Du über SQL nicht lösen, nur über die Applikation. AUTO_INCREMENT erstellt eine eindeutige noch nie genutzte ID. Das ist der Sinn und Zweck dieses Features.
und bei einfügen eines neuen Datensatzes er an das Ende der Tabelle angefügt
wird.
Ans Ende kommt so und so kein Datensatz. mySQL speichert die Datensatz wie es dies für richtig hält.
Datensätze haben keine Reihenfolge. Die ID ist nur ein eindeutiger Schlüssel.
MfG, André Laugks
AUTO_INCREMENT erhöht den Wert eines Feldes nach einfügen eines neuen
Datensatzes um 1. Beim löschen eines Datensatzes steht der Feldwert wieder
zur Verfügung und wird ein neuer Datensatz eingefügt wird er an der Stelle
des zuvor gelöschten Datensatzes eingefügt.
Ich möchte aber, dass wenn ein Datensatz gelöscht wird z.B. mit dem Feldwert
3, dass der Feldwert des folgende Datensatzes nicht mehr 4 ist, sondern 3
und bei einfügen eines neuen Datensatzes er an das Ende der Tabelle angefügt
wird.
CREATE TABLE TableName (
Projekt_Nr BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY...
Was muss ich hier ändern ?
An der Tabelle selbst kannst du nichts ändern. Du könntest eine Neunummerierung vornehmen, nachdem du etwas gelöscht hast:
DELETE FROM tabelle WHERE id=3;
UPDATE tabelle SET id=id-1 WHERE id>3;
Verursacht natürlich einen Riesen-Aufwand, weil ziemlich viele Datensätze bearbeitet werden müßten. Und ich kann mir nicht vorstellen, daß du dein Problem nur mit der Datenbank lösen kannst.
Üblicherweise kannst du bei auto_increment-Feldern davon ausgehen, daß sie sich aufsteigend sortieren lassen. Als eindeutiger Schlüssel der Tabelle also ziemlich gut verwendbar. Aber nicht zum durchnumerieren von Tabellenausgaben. Für sowas solltest du lieber im Skript, welches die Datenbank abfragt und die HTML-Ausgabe erledigt, eine Variable definieren und nach jedem ausgegebenen Datensatz um eins erhöhen. Diese Zahlenangabe ist dann also nicht fest mit den Datensätzen verknüpft, sondern hat nur "optische" Wirkung, aber das ist für eine laufende Nummer sowieso ideal.
Wenn du die eindeutige ID nämlich änderst, dann müßtest du auch alle anderen Tabellen, die sich auf diese ID beziehen, mitändern etc. Das ist ein ziemlicher Aufwand und spricht dafür, daß das Datenbankdesign überarbeitungswürdig ist.
Eventuell ist es auch drin, im SELECT-Statement eine Pseudo-Spalte anzulegen, die sich automatisch selbst hochzählt. Wäre von der Wirkung her aber identisch mit der Zählvariablen im Skript, von daher eigentlich nur belastendes Zeugs für die Datenbank.
- Sven Rautenberg