AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [MySQL] AutoInc fehlende Einträge auffühlen
Thema durchsuchen
Ansicht
Themen-Optionen

[MySQL] AutoInc fehlende Einträge auffühlen

Ein Thema von gsh · begonnen am 2. Feb 2007 · letzter Beitrag vom 4. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#1

[MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 20:18
Datenbank: MySQL • Version: 5.0 • Zugriff über: libmysql.dll
Hi DPler

Ich hab ein Problem mit meiner Datenbank. Ich möchte nämlich das die id nummer in meiner MyISAM Tabllen wenn eine neue Zeile dazu kommt die id werte auffüllt.

Also wenn ich in meiner Datenbank die Werte hab:
Delphi-Quellcode:
id
---
1
2
3
5
6
8
So jetzt soll aber bei einem insert nicht die id 9 vergeben werden sonderen 4. Dannach 7 und so halt. Aber wie sag ich des er des tun soll wenn auf id auf AutoInc steht?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 20:20
Kannst du nur manuell machen, autoinc erhöht der höchsten Wert im 1.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#3

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 20:23
hmm hab ich fast befürchtet
und wie mach ich des am besten mit einem SQL Befehl?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 20:26
Mit einem einfachen SQL-Statement wirst du das nicht hinkriegen.
Warum willst du die Lücken auffüllen?
Gibt es FK anderen Tabellen auf die Tabelle?Wenn nicht könntest du die Tabelle neu nummerieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#5

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 20:32
Zitat von mkinzler:
Mit einem einfachen SQL-Statement wirst du das nicht hinkriegen.
Des muss doch irgendwie gehen

Zitat von mkinzler:
Warum willst du die Lücken auffüllen?
Weil die ids nicht zu groß werden sollten. Und es werden ja meistens nicht viele zeilen in der tabelle sein aber sie ändern sich täglich vllt. 100-500 mal (ändern heisst nicht UPDATE sondern DELETE und INSERT (Alles verschiedene Zeilen))

Zitat von mkinzler:
Gibt es FK anderen Tabellen auf die Tabelle?Wenn nicht könntest du die Tabelle neu nummerieren.
FK? meinst du Fremdschlüssel ja und die kann ich nicht neu einstellen da sie vllt. schon auf einem Blat papier stehen. Also die ids dürfen nicht verändert werden solange sie gültig sind. D.h. neu nummerieren kommt auf keinen fall in frage
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#6

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 2. Feb 2007, 22:30
Du kannst es evtl. so versuchen:

Delphi-Quellcode:
    
 i := 0;
 repeat
   i := i + 1; // Nächste ID
   qry.Active := False;
   qry.SQL.Text := 'SELECT id FROM tbl_mit_ids WHERE id = ' + IntToStr(i); // ID abfragen
   qry.Active := True;
   s := qry.FieldByName('id').AsString;
 until s = ''; // Abbruch wenn ID noch nicht vorhanden
Im Ereignis OnNewRecord der Tabelle kannst Du dann den Wert aus 'i' als neue ID verwenden.

Natürlich muss zuvor das Attribut 'AutoInc' aus der entspr. Tabelle entfernt werden, denn sonst kannst Du das nicht manuell setzen.

Gruß
OG Karotte
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#7

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 3. Feb 2007, 00:26
hmm ja diese möglicheit hab ich mir schon überlegt aber dann müssen unter umständen 2000 Queris ausgeführt werden
geht es optimierter?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#8

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 3. Feb 2007, 11:16
Hallo,

ich habe folgende Idee (ungetestet):
SQL-Code:
SELECT ID FROM Tabelle
  WHERE (ID+1) NOT IN (SELECT ID FROM Tabelle)
Voraussetzung ist, dass ID+1 in der Where-Klausel zulässig ist und MySQL solche verschachtelten Abfragen kennt.

Bei einer Schleife: Wäre es passender, sie als StoredProcedure in die DB zu legen (vorausgesetzt, es gibt dort Schleifen)? Vorgehen etwa so (in Pseudo-Firebird):
SQL-Code:
DECLARE VARIABLE ActualID INTEGER;
DECLARE VARIABLE PrevID INTEGER;
DECLARE VARIABLE Diff INTEGER;
PrevID = 0;
FOR SELECT ID FROM Tabelle INTO :ActualID
DO BEGIN
  Diff = ActualID - PrevID;
  IF (Diff > 1)
  THEN BEGIN
    NextID = PrevID + 1;
    BREAK;
  END
END
SUSPEND
RETURN-Wert wäre dann NextID, und das kann sofort verwendet werden.

Viel Erfolg! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#9

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 3. Feb 2007, 11:55
@gsh:

Zitat von gsh:
hmm ja diese möglicheit hab ich mir schon überlegt aber dann müssen unter umständen 2000 Queris ausgeführt werden
geht es optimierter?
Soll heißen, das Du derzeit ca. 2000 Datensätze in der Tabelle hast?
Sollte aber nichts ausmachen, wenn die Abfrage auf einer einigermaßen aktuellen Maschine läuft und die Netzwerklast nicht zu groß ist.

Und es werden ja nicht nur Datensätze am Ende gelöscht, oder?
Sonst kannst Du Dich ja auch von hinten nach vorn durcharbeiten...

Gruß
OG Karotte
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#10

Re: [MySQL] AutoInc fehlende Einträge auffühlen

  Alt 3. Feb 2007, 12:07
Zitat von Jürgen Thomas:
ich habe folgende Idee (ungetestet):
SQL-Code:
SELECT ID FROM Tabelle
  WHERE (ID+1) NOT IN (SELECT ID FROM Tabelle)
Voraussetzung ist, dass ID+1 in der Where-Klausel zulässig ist und MySQL solche verschachtelten Abfragen kennt.
Japp MySQL scheint sie zu unterstüzen

Aber es sind noch zwei kleine fehler:
So funkt sie komplett:
SELECT id+1 FROM test WHERE (id+1) NOT IN (SELECT id FROM test) LIMIT 1 1. am anfang id+1 da er sonst alle ids eins unter den fehlenden einträge gefunden hat.
2. LIMIT 1 am schluss weil sonst findet er alle Lücken und ich hoffe einfach mal damit das er weniger rechenen muss wenn er nur eine sucht.

Das schöne an der Funktion ... sie liefert immer ein ergebnis. Auch wenn keine lücken sind dann wird einfach die letzte id +1 ausgegeben.


VIELEN DANK Jürgen
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  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 10:46 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