ID in einer mySQL DB

Ötzi

Mitglied
Hallo
Also ich hab ein Problem mit ner mySQL Datenbank, hab auch schon im Forum gesucht aber keine Lösung gefunden!
Ich hab ein Anmeldeskript geschrieben mit dem sich Leute in eine DB eintragen können. Die Datenbank selbst hat als erste Spalte ID mit dem primary key und auto_increment.
klappt ja alles super, aber wenn ich jetzt einen user aus der datenbank lösche bleibt diese id frei, aber ich will das sie "überschrieben" wird.
Ein bisschen unverständlich, also hier mal ein kleines Beispiel:

Der User A hat die ID 8, er ist der letzte User in meiner Liste. Jetzt will er seinen Account nichtmehr und löscht sich deshalb. Somit ist er und die komplette Zeile mit ID 8 aus der DB gelöscht.
Jetzt kommt User B und meldet sich an, er sollte eigentlich ID 8 bekommen weil diese ja die nächste ist, aber er bekommt ID 9.

Woran liegt das und wie kann ich das ändern?
 
das kannst du garnicht aendern!
so ist das nunmal mit einem autoinkrementellen feld, du wirst luecken haben wenn du zeilen loeschst.

du kannst natuerlich dir selber dir luecken wieder fuellen, aber warum ? die id's sind doch im prinzip total uninteressant, wichtig ist doch nur das sie eindeutig sind und so einen user eindeutig identifizieren. welche zahl dahinter steht ist total egal...
 
Yepp! So ist es mit Auto increment.

Wenn du die Dinger an einem Schnürchen haben willst dann musst du die IDs schon selbst setzten. Das ist alles kein Problem. Nur nehmen wir mal an du hast 1000 einträge dadrin also alle Ids von 1 bis 1000. Jetzt löschst du den 2 ten eintrag. Da ist die Ordnung erstmal kaputt. Willst du das wieder alles umsortieren wirst du enorme Probleme mit der Performence des/der sortier queries haben.

Ich würde Auto Increment lassen und falls sich dadurch ein anderes Problem in deinem Code ergibt, dass dann rigendwie anders lösen aber nicht über die ID der DB.

So Long
TheVirus
 
Ok thx für eure schnelle Antwort. Ich werds jetzt so lassen, habt ja eigentlich recht ist ja total egal was da für ne nummer steht :-)
und wenn wegen dem umsortieren die performance leidet ist das auch nicht gut. ich werds lassen!
 
Da ich zur Zeit das gleiche "Problem" habe, hole ich einfach mal dies alte Thema hervor. Und zwar gefällt es mir auch nicht, eine Tabelle mit "lückenhaften" ids zu haben. Zwar ist der id-Spielraum bei unsigned int mit 4294967295 sehr hoch, doch wird die Grenze, je nachdem, wie lange die Software verwendet wird, irgendwann halt doch erreicht. Ob ich bzw. wir alle dann noch leben, ist zu bezweifeln, aber darum geht es mir nicht mal.
Ich möchte, dass das Programm längst möglich seine Arbeit tun kann :-) .

Die Reihenfolge der ids ist mir egal, schließlich sind sie ja zur reinen Identifikation da. Was mir allerdings noch fehlt, ist ein schlauer Algorithmus, der unbelegte ids findet. Ich hatte mir überlegt beim Entfernen eines Datenbank - Eintrages zurückgewonnene ids in einer extra Tabelle zu sichern, die dann vor einem neuen Eintrag erstmal durchgelaufen wird. Kanonen auf Spatzen? Auf jeden Fall viele neue Tabellen und eine Performancefrage...

Eure Meinungen würden mich interessieren :)
Grüße!
TriloByte
 
schön wäre es sicherlich wenn man das aktivieren kann, vielleicht gehts ja auch und wir wissen es bloss nicht. Aber auf der anderen seite, überprüf doch die aktuelle ID nach jedem Eintrag, wenn sie sich der max. Grenze nähert, lass dir eine eMail zuschicken.
Dann kopierst du die Tabellen-Struktur, liest alle Einträge ohne ID aus, fügst sie in die Kopierte tabelle ein und benennst diese anschliessend um. Fertig ;)
Dann hast du halt einmal alle 200 Jahre ein Out of Order deines Prudktes wegen Wartung *fg*
 
Original geschrieben von TriloByte
Da ich zur Zeit das gleiche "Problem" habe, hole ich einfach mal dies alte Thema hervor. Und zwar gefällt es mir auch nicht, eine Tabelle mit "lückenhaften" ids zu haben. Zwar ist der id-Spielraum bei unsigned int mit 4294967295 sehr hoch, doch wird die Grenze, je nachdem, wie lange die Software verwendet wird, irgendwann halt doch erreicht. Ob ich bzw. wir alle dann noch leben, ist zu bezweifeln, aber darum geht es mir nicht mal.
Ich möchte, dass das Programm längst möglich seine Arbeit tun kann :-) .
Guck Dir die Zahl nochmal ganz genau an. So, und wenn Dir die dann immer noch nicht reicht, dann kannst Du genau so gut anstatt den Spaltentyp int auch bigint verwenden:

Eine große Ganzzahl. Der vorzeichenbehaftete Bereich ist -9223372036854775808 bis 9223372036854775807. Der vorzeichenlose Bereich ist 0 bis 18446744073709551615.

Original geschrieben von TriloByte
Die Reihenfolge der ids ist mir egal, schließlich sind sie ja zur reinen Identifikation da. Was mir allerdings noch fehlt, ist ein schlauer Algorithmus, der unbelegte ids findet. Ich hatte mir überlegt beim Entfernen eines Datenbank - Eintrages zurückgewonnene ids in einer extra Tabelle zu sichern, die dann vor einem neuen Eintrag erstmal durchgelaufen wird. Kanonen auf Spatzen? Auf jeden Fall viele neue Tabellen und eine Performancefrage...
Absoluter Unsinn. Sowas kostet nur Zeit und drückt erheblich auf die Performance. Außerdem hat es schon seinen Sinn, dass jede ID auch nur ein einziges mal vergeben wird. Als Beispiel sei hierbei nur mal erwähnt, wenn Du mehrere Tabellen miteinander verbunden hast (über eben diese ID), dann sind entweder die Verknüpfungen defekt, oder Du musst in sämtlichen Tabellen alle miteinander verbundenen Datensätze andern. Und da stellt sich mir die Frage: Warum?
 
@gecko: Wieso denn? Wenn er eine Autarke Tabelle hat ohne Verknüpfungen kann er es doch so machen ;)
 
Zurück