[MySQL] Lücken in Feld mit fortlaufender Nummer finden

DelphiKing

King with a crown
ID: 46719
L
20 April 2006
6.553
729
Aloha,

ich habe eine Tabelle mit einem id-Feld welches fortlaufend (1 .. n) durchnummeriert wurde. Nun werden aber häufig Datensätze aus der Tabelle gelöscht und es entstehen Lücken in dieser fortlaufenden Nummerierung.

Wenn nun ein neuer Datensatz eingefügt wird, soll dieser als id dann eine der freien id's eines gelöschten Datensatzes erhalten .. also quasi die Lücken wieder auffüllen.
Wie finde ich jetzt die erste Lücke, ohne in ner Schleife n Queries zu machen und zu schauen ob ein Datensatz gefunden wird? Ist leider etwas unperformant, wenn es da um 50000 Datensätze geht.

Die Notlösung wäre da im Moment wohl einmal die ganze Tabelle durchzugehen und alle gefundenen Lücken in ne zweite Tabelle zu schreiben, auf die dann zugegriffen werden kann. Das müsste halt immer mal wieder aktuallisiert werden. Ist aber nicht wirklich eine schöne Lösung m.E.n.


Liebe Grüße
flo

PS: Bitte keine Diskussion über den Sinn und Unsinn des Lückenfüllens bei ner "fortlaufenden" Nummerierung - ich muss es nunmal machen.
 
Also ich würde einmal die komplette Tabelle durchgehen und die Lücken beseitigen (per Script).
Wenn alle Lücken gefüllt sind würde ich das Hauptscript so bearbeiten, dass bei jedem Löschvorgang die höchste id automatisch durch die eben gelöschte id ersetzt wird, somit der letzte Datensatz die id des zuletzt gelöschten erhält und die Lücke gefüllt wird.
Dies geht natürlich nur, wenn die Reihenfolge der ids egal ist.
 
Die Reihenfolge der IDs ist egal, aber bestehende IDs dürfen auf keinen Fall verändert werden. Also kurz alles umordnen geht leider nicht.
 
die kleinste Lücke bekommst Du z.B. mit diesem SELECT:

SELECT MIN(ID)+1 FROM tabelle A
WHERE NOT EXISTS
( SELECT * FROM tabelle B
WHERE B.ID = A.ID+1 )


zu beachten ist, dass das Statement nur funktioniert, wenn mindestens 1 Satz in der Tabelle ist, und es nur Lücken überhalb des niedrigsten Wertes findet.

Über die Performance möchte ich dabei allerdings keine Aussage machen
 
Hast du mein "PS" gelesen? Wenn der Kunde das so will und ggf. auch braucht (und sich nicht vom Gegenteil überzeugen laesst), dann kriegt er das.
Ne, sorry, das PS hab ich überlesen. Aber ich würd nie jemanden so eine ID (ID is ne Abkürzung und steht für was) verpassen und schon gar keinem "Kunde[n]", der mich für diesen Murks auch noch zahlt. Mach ich mir doch meinen Ruf kaputt, wenn ich sowas herstell.

Wenn man wirklich eine fortlaufend numerierte Spalte braucht, so erzeugt man diese zusätzlich, niemals aber sollte man die ID auf Anwendungsebene genauso wie die IDs auf Schlüssel-, Seiten- und darunterliegenen Ebenen der Datenbank manipulieren!
 
Aber ich würd nie jemanden so eine ID (ID is ne Abkürzung und steht für was) verpassen und schon gar keinem "Kunde[n]", der mich für diesen Murks auch noch zahlt. Mach ich mir doch meinen Ruf kaputt, wenn ich sowas herstell.

richtig!
In nem halben Jahr kommt nen anderer Entwickler dran und sagt es ist Müll, der Auftraggeber weiß, dass du es gebaut ist und du bist der gelackmeierte. Egal ob der Kunde es damals wollte oder nicht.
Es gibt Regeln, die sollte man nie brechen, auch nicht gegen Bezahlung, und da wäre einer der Punkte die "Vergewaltung von auto_increnment Keys"