SQL Zahlen Zwischenräume füllen

Registrierer

Erfahrenes Mitglied
Hallo und guten Abend,

ich hab eine DB, die vor ca. 10 Jahren unter einer DOS Oberfläche mit Kundendaten gefüttert worden ist.
Die Kundennummern wurden willkürlich vergeben und sind mit Rechnungen usw. verknüpft (also nicht änderbar).
es geht von 1 bis ca. 20.000 wobei aber manchmal Kundennummern zwischendurch fehlen.
Diese möchte ich nun auffüllen wenn ich einen neuen Datensatz anlege, aber wie?
Gibt es sowas wie eine "Zählfunktion", die merkt wenn die nächste natürliche Zahl fehlt?

Würde mich über ein Stichwort freuen, danke...
 
Diese Frage hatte vor kurzem schon mal jemand. Gut, dass ich mir manche Codeschnipsel speichere *g*

Mit MySQL gehts zum Beispiel so (geht so wahrscheinlich mit jeder DB die Subqueries unterstützt. In MS Access müsste man es auf 2 Views aufteilen)
Vorsicht! Bei Multiuser-Applikationen kann das zu problemen führen!
SQL:
SELECT
    MIN(newIds.newId) AS firstNotUsedId
FROM
    (SELECT id + 1 AS newId FROM test) AS newIds
    LEFT JOIN (SELECT id FROM test ) AS ids
        ON newIds.newId = ids.id
WHERE
    ids.id IS NULL;

Nachtrag:
Für reine SQL-Fragen empfiehlt sich das Subforum Relationale Datenbanksysteme anstelle von PHP
 
Zuletzt bearbeitet von einem Moderator:
Die Suche in den Weiten des Internets ergab folgende Lösung:

SQL:
SELECT MIN(feld) + 1 FROM tabelle AS a WHERE NOT EXISTS (SELECT * FROM tabelle AS b WHERE b.feld = a.feld + 1)

Die Angaben "tabelle" und "feld" musst du natürlich noch entsprchend anpassen, aber das ist ja wohl klar. Außerdem muss das Feld "feld" auch ein numerisches sein, davon gehe ich jetzt einfach mal aus.

Gruß Thomas
 
Zuletzt bearbeitet von einem Moderator:
Beide SQLs funktionieren nach dem gleichen Prinzip. Nimm jede ID+1 und schaue ob diese bereits existiert. Von der Menge nicht Existenten ID+1 nimm die Kleinste....
 
Danke euch beiden!

Da hier tatsächlich eine Mehrbenutzerumgebung vorliegt (bis zu 5 Benutzer), prüfe ich vor dem einfügen ob die Nr. schon vergeben wurde und nehme dann ggf. die nächste freie Nr.

MfG
 
Danke euch beiden!

Da hier tatsächlich eine Mehrbenutzerumgebung vorliegt (bis zu 5 Benutzer), prüfe ich vor dem einfügen ob die Nr. schon vergeben wurde und nehme dann ggf. die nächste freie Nr.

MfG
Das Problem ist, wenn zwei (A und B) gleichzeitig einen Eintrag abschicken.

Das folgende Szenario ist möglich (alles innerhalb seeeehr kurzer Zeit):
A klickt auf speichern
B klickt auf speichern
für A wird die nächste Nummer ausgelesen
für B wird die nächste Nummer ausgelesen (ist dieselbe wie für A)
der Eintrag von A wird eingeführt und commited
der Eintrag von B wird eingeführt und commited -> Error: duplicate key
 
Ich gehe ja mal davon aus das du nach dem Ermitteln einer freien Nummer den neuen Eintrag auch gleich speicherst.
Der Vorgang betrifft ja die selbe Tabelle, kannst du dann nicht für die Dauer -> "Nummer ermitteln" -> "Datensatz speichern" diese Tabelle für den Zugriff mit "LOCK TABLE" sperren?

Sollte ein zweiter Benutzer genau in diesem Moment auf die Daten/die Funktion zugreifen so bekommt er dann halt einen Hinweis "Bitte erneut versuchen."
 
Zurück