AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MySQL: id: wiso nimmt er nicht die niedrigst frei
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL: id: wiso nimmt er nicht die niedrigst frei

Offene Frage von "yankee"
Ein Thema von yankee · begonnen am 26. Mai 2004 · letzter Beitrag vom 27. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

MySQL: id: wiso nimmt er nicht die niedrigst frei

  Alt 26. Mai 2004, 15:44
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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

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

  Alt 26. Mai 2004, 16:29
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
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#3

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

  Alt 26. Mai 2004, 16:34
Das finde ich jetzt gerede mal nicht so toll...
Also was ist max(id)? Wie kann ich diese Funktion ausführen??
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

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

  Alt 26. Mai 2004, 16:39
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
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 26. Mai 2004, 21:55
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 nehme ein BIGING
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#6

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

  Alt 26. Mai 2004, 22:14
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.
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7

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

  Alt 26. Mai 2004, 22:29
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Alfons_G

Registriert seit: 7. Jun 2002
Ort: München
296 Beiträge
 
Delphi 2007 Architect
 
#8

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

  Alt 27. Mai 2004, 10:26
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.

Alfons Grünewald



Alfons Grünewald
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#9

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

  Alt 27. Mai 2004, 10:36
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...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#10

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

  Alt 27. Mai 2004, 13:42
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr.
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