![]() |
Datenbank: MySQL • Version: 5.0 • Zugriff über: libmysql.dll
[MySQL] AutoInc fehlende Einträge auffühlen
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:
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?
id
--- 1 2 3 5 6 8 |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
Kannst du nur manuell machen, autoinc erhöht der höchsten Wert im 1.
|
Re: [MySQL] AutoInc fehlende Einträge auffühlen
hmm hab ich fast befürchtet
und wie mach ich des am besten mit einem SQL Befehl? |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
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. |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
Zitat:
Zitat:
Zitat:
|
Re: [MySQL] AutoInc fehlende Einträge auffühlen
Du kannst es evtl. so versuchen:
Delphi-Quellcode:
Im Ereignis OnNewRecord der Tabelle kannst Du dann den Wert aus 'i' als neue ID verwenden.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 Natürlich muss zuvor das Attribut 'AutoInc' aus der entspr. Tabelle entfernt werden, denn sonst kannst Du das nicht manuell setzen. Gruß OG Karotte |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
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? |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
Hallo,
ich habe folgende Idee (ungetestet):
SQL-Code:
Voraussetzung ist, dass ID+1 in der Where-Klausel zulässig ist und MySQL solche verschachtelten Abfragen kennt.
SELECT ID FROM Tabelle
WHERE (ID+1) NOT IN (SELECT ID FROM Tabelle) 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:
RETURN-Wert wäre dann NextID, und das kann sofort verwendet werden.
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 Viel Erfolg! Jürgen |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
@gsh:
Zitat:
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 |
Re: [MySQL] AutoInc fehlende Einträge auffühlen
Zitat:
Aber es sind noch zwei kleine fehler: So funkt sie komplett:
SQL-Code:
1. am anfang id+1 da er sonst alle ids eins unter den fehlenden einträge gefunden hat.
SELECT id+1 FROM test WHERE (id+1) NOT IN (SELECT id FROM test) LIMIT 1
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz