Nächsten freien Primärschlüssel ermitteln
-
Wie kann man in SQL bei einer MySQL5-Datenbank den nächsten freien Primärschlüssel ermitteln?
Meine Spalte der Primärschlüssel ist durchnummeriert.
1
2
3
4
5Es Skript löscht Einträge nach bestimmten Kriterien. Es wird dann z.b. die Zeile mit Pkey 2 entfernt.
1
3
4
5Jetzt möchte ich, bevor ich einen neuen Datensatz anlege, den nächten freien Pkey ermitteln. In diesem Fall möchte ich als die 2 als Pkey wiederverwenden.
Gibts da fertige SQL-Funktionen oder muss ich das selber lösen?
-
Das ist aber keine gute Lösung.
Hier mal 2 Beiträge warum:
http://forum.de.selfhtml.org/archiv/2004/1/t69122/
http://forum.de.selfhtml.org/archiv/2002/12/t32430/
-
Das ist aber keine gute Lösung.
Hier mal 2 Beiträge warum:
http://forum.de.selfhtml.org/archiv/2004/1/t69122/
http://forum.de.selfhtml.org/archiv/2002/12/t32430/
-
ich möchte es aber trotzdem machen. in meinem fall ist es nämlich absolut ungefährlich.
es scheint aber wohl keine fertigen mysql-funktionen dafür zu geben. dann muss ich mir wohl was in php schreiben.
oder kennt jemand eine lösung?
-
datenbänker schrieb:
oder kennt jemand eine lösung?
Hilfstabelle anlegen, einen Trigger definieren, der beim Löschen den Wert des Primärschlüssel aus der Tabelle in die Hilfstabelle überträgt, SQL-Funktion schreiben, die aus der Hilfstabelle den kleinsten Wert übernimmt (und löscht) und diesen für die eigentliche Tabelle verwendet.
Das ganze sollte halbwegs performant sein.
-
wie wäre es hiermit?
aber machen würde ich es auch nicht.
select coalesce(min(lfnr),0)+1 from (select lfnr from tabelle a where (select count(*) from tabelle b where b.lfnr = a.lfnr+1) = 0) c;
habe ich mit postgres ausprobiert
jenz
-
Hilfstabelle die sich gelöschte Keys merkt und den nächstkleinsten wieder vergibt. Hab ich auch letztens irgendwo live gesehen und scheint zu funktionieren. Seitdem Belegnummernkreise vollständig bleiben müssen, basteln in letzter Zeit viele an solchen Dingern rum
-
jetzt ist die Frage, ob sich der Aufwand lohnt... welchen Nutzen erhoffst du dir dadurch?
Die per auto-increment hochgezählte Datensatz-ID dient nicht dazu, die Datensätze schön durchzunumerieren, sondern sie eindeutig zu identifizieren.
mit Betonung auf "eindeutig"
-
zwutz schrieb:
jetzt ist die Frage, ob sich der Aufwand lohnt... welchen Nutzen erhoffst du dir dadurch?
Die per auto-increment hochgezählte Datensatz-ID dient nicht dazu, die Datensätze schön durchzunumerieren, sondern sie eindeutig zu identifizieren.
mit Betonung auf "eindeutig"
-
Select min(id) from tabelle a where not exists
(select id from tabelle b where b.id = a.id + 1 )sollte so oder ähnlich funktionieren, ist aber nicht getestet!
-
Cpp_Junky schrieb:
Seitdem Belegnummernkreise vollständig bleiben müssen, basteln in letzter Zeit viele an solchen Dingern rum
Wer PKs als fachliche Schlüssel mißbraucht, hats nicht besser verdient.