SQL: Spalte für Durchnummerierung?
Ich arbeite an einem Interface für eine Datenbank. Es ist eine HTML Tabelle, in denen Inpute Felder type="text" sind.
Jetzt rufe ich, wenn ich einen Button drücke ein PHP Script auf, dass den Wert in der Tabelle ändern soll. Um das ganze gut hinzubekommen brauche ich eine Durchnummerierung. Wenn ich aber eine Spalte mit auto_increment erstelle und danach wieder Elemente lösche und hinzufüge, geht die Nummerierung nicht wieder von 0 bzw. 1 los, sondern, als wären die gelöschten Elemente noch da.
Das zerstört mein System komplett.
Gibt es eine gute Möglichkeit das hinzubekommen?
3 Antworten
![](https://images.gutefrage.net/media/user/wotan38/1593349574912_nmmslarge__0_0_730_730_ced1faab479deec86c068f7acd1a5c17.jpg?v=1593349575000)
Das Problem ist ganz einfach. Du hast Dir ein System ausgedacht, das so nicht funktionieren kann. Du musst Dir ein anderes System ausdenken, eines das funktioniert. Das auto_increment ist für was ganz anderes gedacht, und dort funktioniert es auch.
Automatische Numerierungen kann man nur dort verwenden, wo man als Anwender nichts damit tun muss, also nur für datenbankinterne Verarbeitung.
Ich habe bei einem Kunden eine Datenbank mit 57 Tabellen und komplexen Verknüpfungen laufen. Und bei keiner einzigen gibt es eine automatische Nummerierung. Warum? Weil es kaum eine praktische Anwendung dafür gibt. Es wäre Sache des Informatikunterrichts auf die richtige Anwendung hinzuweisen.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Autoincrements haben eine strenge Monotonie, bis es zum warp around kommt, dann werden ggf. Werte wiederverwendet, wenn sie frei sind. Das ist erstmal das exakt gewünschte Verhalten.
Ich kann aber anhand Deiner Frage nicht erkennen wo denn nun Dein Problem liegen sollte: Der Primärschlüssel ist immer unique, sodaß eine Zuordnung kein Problem darstellen sollte.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Okay, wenn das Autoincrement Dein Schlüssel ist, dann numerierst Du in der Tabelle natürlich die Zeilen mit dem Autoincrement der bestehenden Datensätze durch. Dabei ist auch egal, ob es Lücken in der Folge gibt.
Wenn Du die IDs nicht dem Bearbeitenden visuell präsentieren möchtest, dann nimmst Du hierzu einfach ein hidden input und fertig ist die Laube. Einfaches iterieren über die Tupel des Forms mit Aktualisierung der DB ist dann kein Problem mehr.
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Danke, im Nachhinein wundere ich mich, dass ich nicht auf die Idee gekommen bin.
![](https://images.gutefrage.net/media/default/user/5_nmmslarge.png?v=1438863662000)
Du kannst ja sogar aus ästhetischen Gründen die Tabelle visuelle linear durchnumerieren. Der Nutzer muß ja nicht sehen, daß die Tupel eigentlich andere IDs haben, wenn das aus optischen Gründen so gewollt ist.
![](https://images.gutefrage.net/media/default/user/15_nmmslarge.png?v=1551279448000)
Einen eigenen Zähler einführen -- wenn eine Zaile gelöpscht wird, musst du halt deine Tabelle von "Hand" updaten, damit die "Lücke" gefüllt wird.
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/default/user/15_nmmslarge.png?v=1551279448000)
In einer Schleife, die Ganze Tabelle von Anfang (ORDER BY myZaehler, damit von 1 bzw 0 angefangen wird)) an durchgehen, wenn eine Lücke entdeckt wird (Annnahme nur eine Zeile wurde gelöscht), ab der nächsten Zeile myZaehler durch myZaehler - 1 ersetzten.
(nur ein Vorschlag, gibt auch andere Möglichhkeiten -- ist aber immer aufwendig und eigentlich sinnlos, wie KarlRanseier sagt -- auch wenn du das Gegenteil meinst)
![](https://images.gutefrage.net/media/default/user/11_nmmslarge.png?v=1551279448000)
Ich stelle die Daten in einer HTML Tabelle dar. Mit einem form action attribut übermittle ich die Daten per post an ein anderes Script. Die HTML Tabelle ist so generiert, dass der Name der einzelnen Inputfelder Spaltenname-IndexInDerTabelle ist. Jetzt gehe ich mit einer While Schleife durch alle Wert und aktualisiere per UPDATE die Werte in der Datenbank. Ich habe keine Möglichkeit gefunden, das ohne eine Spalte zu machen, die die Datenbank von Anfang an durchnummeriert.