EKKi: Tiefste freie ID ermitteln

Beitrag lesen

Mahlzeit,

Ich habe eine Tabelle mit sagen wir 100 ID's. Nun lösche ich Datensatz Nummer 45. Somit ist diese ID wieder frei, während alle anderen 99 (1-100) noch belegt sind.

Und diese jetzt wieder "frei gewordene" ID möchtest Du für einen neuen Datensatz mit möglicherweise - und sogar recht höchstwahrscheinlich - ganz anderen Daten verwenden?

Das ist - wie dedlfix schon bemerkte - eine GANZ schlechte ID (das Wortspiel musste einfach sein *g*). Stell Dir nur mal folgenden Fall vor:

Du hast eine Tabelle mit Kunden und eine mit Bestellungen. In der Tabelle "kunden" hast Du einen Datensatz mit der ID 42, "Karl Klapp". Karl Klapp hat auch Bestellungen getätigt, so dass in der Tabelle "bestellungen" mehrere Einträge mit der "kundenid" 42 vorhanden sind.

Wenn Karl Klapp jetzt nicht mehr Kunde ist und Du den Datensatz löschst, dann bekommst Du einerseits erstmal Inkonsistenzen in Deiner Anwendung, weil Du Bestellungen hast, die eine nicht (mehr) existierende "kundenid" besitzen (außer natürlich, Du löschst diese Bestellungen kaskadierend gleich mit). Und andererseits und weiterhin hast Du, wenn Du dann diese "kundenid" 42 für einen neuen Kunden (nennen wir ihn "Hans Schranz") wiederverwendest, absolut falsche Informationen in der Datenbank - weil dann nämlich dort drinsteht, dass Hans Schranz schon ganz viel bestellt hat ... was er ja aber gar nicht hat, sondern Karl Klapp, der diese ID vorher hatte.

Grundsätzlich ist bei mehreren voneinander abhängigen Tabellen mit Fremdschlüsselbeziehungen eindeutig davon abzuraten, einen Datensatz wirklich jemals physisch zu löschen ... Löschkennzeichen setzen OK, inaktiv schalten OK, aber richtig löschen: niemals!

Viel schlimmer ist jedoch, eine einstmals vergebene ID wiederaufleben zu lassen, weil Du Dir dadurch im Normalfall mehr Probleme einhandelst, als Du Dir dadurch Vorteile verschaffst (ich wüsste im Moment nicht einmal einen einzigen Vorteil, den so ein Vorgehen hätte).

Achja: und mit PHP hat das Ganze nun wirklich ÜBERHAUPT NICHTS zu tun ... :-)

MfG,
EKKi

--
sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|