Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL: id: wiso nimmt er nicht die niedrigst frei (https://www.delphipraxis.net/22936-mysql-id-wiso-nimmt-er-nicht-die-niedrigst-frei.html)

yankee 26. Mai 2004 14:44


MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Ich habe eine MySQL-DB. Erst Spalte heißt id, typ: int, extras: auto_increment, primärschlüssel
Ich habe mir das so vorgestellt, dass der immer wenn ich einen neuen Datensatz eintrage, er automatisch bei id die kleinste nochnicht belegte Zahl nimmt. Das macht er jedoch nicht. Sofern ich viel Bewegung in der DB habe, werde ich ja schnell zu überdemensionalen Zaheln kommen. Was kann ich dagegen tun?

franktron 26. Mai 2004 15:29

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Der Autoincrementale index erstellt immer eine eindeutige zahl (also niemals eine zahl 2 mal)

Das was du machen könntest den Index ab und zu wieder auf max(id) zu setzten

yankee 26. Mai 2004 15:34

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Das finde ich jetzt gerede mal nicht so toll...
Also was ist max(id)? Wie kann ich diese Funktion ausführen??

franktron 26. Mai 2004 15:39

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
SQL Anweisung
SELECT MAX(ID)
FROM tabelle

gibt als wert den maximalen Wert vom Fedl id zurück

und dann mit

ALTER TABLE
tabelle
AUTO_INCREMENT = wert

Den AUTO_INCREMENT auf wert setzten

Mann sollte nur aufpassen was man mit der Tab macht wenn der Index auf irgendeine andere Tab verweist gibt das nämlich Datensalat :-D

Sharky 26. Mai 2004 20:55

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Zitat:

Zitat von yankee
... Sofern ich viel Bewegung in der DB habe, werde ich ja schnell zu überdemensionalen Zaheln kommen. Was kann ich dagegen tun?

Hai yankee,
das sollte aber unter normalen Bedingungen nie zu einem Problem werden. Wenn Du dein ID-Feld als unsigned Integer deklarierst sind das Zahlen von 0 bis 4.294.967.295
Und wenn das nicht reicht :gruebel: nehme ein BIGING ;-)

yankee 26. Mai 2004 21:14

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Trotzdem finde ich das unglaublich unschön so riesige Zahlen einzugeben. Außerdem hat sich schon öfters mal gezeigt, dass das Prinzip "bis dahin werden wir eh nicht kommen" schlecht ist.
So miente Microsoft irgendwann in den 90ern, dass bis zum Jahr 2000 es keine Festplatten über 512 MB geben wird und 8 MB Speicher auch bis dahin reichen wird, weswegen DOS nicht mehr unterstützte.
Das sich dies als Blödsinn rausstellte, wissen wir ja jetzt.

Ich habe jedenfalls die SQL-Befehle mal ausgeführt.
In einem Fall funktioniert es: Wenn die Tabelle leer ist.
Wenn aber Beispielsweise ein Eintrag drin ist, mit der ID 1000, dann sind die IDs 0-999 nicht nutzbar. Find' ich nicht so gut. Und mit der Zeit verschiebt sich die Grenze nach oben. Besonders, da alle Veränderungen an der DB automatisch durch Skripte gesteuert wird.
Ich lass mich ja noch überzeugen, dass die Kunden Tabelle (das ganze ist Teil eines Webshops...) nie auf 2 Milliarden kommen wird. Aber Was ist mit der Tabelle mit den Bestellungen? Der User bestellt was, bestellung ist abgeschlossen. Nee, ich habe mich vertan, bestellung löschen. Der User gibt vielleicht 2 Bestellungen pro Woche auf. Bei 10.000 Usern haben wir die Int gernze in 5 Jahren erreicht. Ich glaube zwar ehrlichkeit nicht, dass der Webshop jemals soviele Kunden haben wird, aber sage niemals nie! Malabgesehen davon, dass es unelegant ist, so eine Obergrenze zu haben.

Chewie 26. Mai 2004 21:29

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Gut, die andere Möglichkeit wäre, selbst Hand anzulegen.
Du fängst bei 1 an und nimmst sonst den Maximalwert der Tabelle + 1. Wird ein Datensatz gelöscht, so schreibst du diese ID in eine neue Tabelle.
Willst du einen neuen Datensatz einfügen, kuckst du nach, ob diese ID-Tabelle leer ist. Wenn nein, nimm eine Nummer raus und entferne sie aus der Tabelle. Wenn sie leer ist, dann nehm wieder den Max-Wert + 1.

Alfons_G 27. Mai 2004 09:26

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Die Nummern von Hand zu erzeugen, ist die einzige Möglichkeit, die es gibt. Dass für ein AutoIncrement immer die Zahl nach dem höchsten bisherigen Wert genommen wird, ist bei allen Datenbanken üblich, nicht nur bei MySQL. Der Grund ist, dass andernfalls bei großen Datenbeständen die Performance ganz erheblich einbricht, wenn immer alls Datensätze untersucht werden müssen, um eine neue ID zu erzeugen.
Bei MySQL muß man die manuelle ID-Erzeugung immer vom aufrufenden Programm erledigen lassen. Bei DB-Systemen, welche Trigger anbieten, geht das auch direkt in der Datenbank.

:coder:

yankee 27. Mai 2004 09:36

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Kann man den eine auf auto_increment gestellte id ändern?
Dann könnte ich ja per cronjob oder sowas regelmäßcg mal 'ne Schleif durchlaufen lassen, so nach dem Motto:
Delphi-Quellcode:
for i:=dbeintraege downto 1 do
begin
if dbeintrag[i-1] not exist then
  begin
    dbeintrag[i-1] :=dbeintrag[i];
    delete(dbeintrag[i]
  end;
end;
Das der Code so wie er da steht nicht funzt, is ja logisch, aber vom system her müsste es doch gehen. Vorrausgesetzt man kann in den ids einfachso rumanipulieren...

Wenn das nicht geht, schmeiße ich eben die ganze Spalte raus. Bis jetzt habe ich DBs auch immer ohne id gemacht und mal abgesehen davon, dass die MySQL-Abfragen leicht länger werden, sehe ich da auch kein Nachteil...

Chewie 27. Mai 2004 12:42

Re: MySQL: id: wiso nimmt er nicht die niedrigst frei
 
Auf der MySQL-Doku-Seite hab ich mal was drüber gelesen. Ich glaub, es geht nicht, dass man den Wert direkt manipuliert. Man kann aber mit ALTER TABLE die Option auto increment entfernen, die Nummer dann manipulieren und schließlich wieder auto increment aktivieren.
Geh mal auf die MySQL-Manual-Seite und such mal nach "auto increment" oder ähnlichen Begriffen/Schreibweisen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz