Wie ermittele ich die nächste freie Id in einer Datenbank?

4 Antworten

Lass die ID beim Insert weg, die DB macht das alleine - zumindest manche DB-Systeme.
Bei Oracle gibt's Sequences und von denen kannst Du mit "NEXTVAL" den nächsten Wert abrufen.
Für TSQL gibt's noch andere Möglichkeiten (z.B. IDENT_CURRENT und IDENT_INCR).

Frag einfach Google, diese Frage wurde garantiert öfter beantwortet, als Du in deinem Leben Antworten lesen kannst.

[...] nämlich dann wenn der letzte Datensatz zuvor gelöscht wurde

Dieser Fall sollte aber nicht beachtet werden, da zu langsam.
Es wird nur hochgezählt, wenn dabei IDs ungenutzt verbleiben, ist das egal, plane das bei der Größe das Wertes mit ein.

Woher ich das weiß:Berufserfahrung – C#.NET Senior Softwareentwickler

Eine ID ist zum eindeutigen Identifizieren - wie aus deim Kürzel hervor geht. Deshalb niemals eine ID nochmals verwenden! Wenn du dies tust ist damit die Integrität deiner Datenbank dahin. Ich verstehe auch nicht wieso du die ID dem User anzeigen willst? zum einen müsstest du die ID dann bis zum Abschluss der Transaktion Reservieren und stelle dir die Frage was hat dein User für einen mehrwert wenn er die ID kennt.


dieTrolle 
Fragesteller
 08.06.2021, 10:14

Genau das Wiederverwenden möchte ich vermeiden. Was das Anzeigen betrifft, frage nicht mich sondern den Bekannten für den ich das Ganze mache. Er läßt sich von der Idee der Anzeige nicht abbringen zumal die id auch für eine Klassifizierung verwendet wird.

0

Du hast hier einen groben Design-Fehler. Die ID der Datenbank wird automatisch vergeben und dich interessiert vorher nicht, welche ID das werden könnte. Du kannst das auch nicht vorher abfragen, da zwischen Abfrage und dem Anlegen eines Datensatzes schon ein weiterer Datensatz angelegt werden kann und die abgefragte ID dann nicht mehr stimmt.

Wenn du unbedingt eine ID anlegen willst, die bspw. eine Kundennummer oder etwas in der Art ist, dann verwende dafür ein extra Feld, welches nichts mit deine Primary Key zu tun hat und bspw. customer_number heißt. Die aktuell Nummer kannst du dir in einer extra Tabelle speichern und bei jeder Abfrage erhöhen. Diese Nummer übernimmst du dann gleich in dein Formular zum Anlegen des Nutzers oder führst es in der Session mit.

Natürlich muss du dann aufpassen, dass dir keine manipulierten Daten übermittelt werden und die Nummer 1. noch nicht existiert und 2. kleiner als die aktuell letzte Nummer ist.

Alternativ legst du einen temporären Datensatz an, der erst „scharf“ geschaltet wird, wenn der Nutzer die Anmeldung abschließt und ansonsten nach x Minuten wieder gelöscht wird.

Woher ich das weiß:Berufserfahrung – Entwickle seit > 20 Jahren Anwendungen mit PHP.

Generell solltest du es vermeiden IDs neu zu vergeben, die es schonmal so gegeben hat. Das kann große Probleme nach sich ziehen.

Wenn du es dennoch machen willst, dann musst du eine Abfrage schreiben, die eben genau die erste freie ID ermittelt. Mit Oracle z.b. so (ID = maximal 10-Stellige Zahl):

select min(n) from
  ( select rownum n from dual connect by level <= 9999999999) a

left join tabelle m on a.n = m.id
  where m.id is null
  and n >= (select min(minid.id) from tabelle minid) 
  and n <=  ( select max(maxid.id) from tabelle maxid)

Wenn hier null zurückkommt, dann muss einfach max(id)+1 genommen werden.


dieTrolle 
Fragesteller
 08.06.2021, 09:54

Vieleicht hatte ich mich nicht korrekt ausgedrückt. Ich will keine Id wiederverwenden sondern nur die nächste mögliche Id ausgeben.

0
ZaoDaDong  08.06.2021, 09:55
@dieTrolle

Dann würde ja schon "select max(id) + 1 from tabelle" reichen. Oder eben eine Sequenz, die in der DB gespeichert ist und per Trigger automatisch eine ID setzt, sobald du einen Insert machst.

0
dieTrolle 
Fragesteller
 08.06.2021, 09:59
@ZaoDaDong

Das ist ja Bestandteil meiner Frage. Wurde zuvor der letzte Datensatz gelöscht steht dessen Id nicht mehr zur Verfügung, wird aber nicht bei der Abfrage der max(id) berücksichtigt sondern entspricht dann max(id)+1. Oder nicht?

0
showgirl1  08.06.2021, 10:00
@dieTrolle

Hä du hast doch von autoincrement geschrieben - warum sollen da Lücken drin sein??? So nen DBMS weiß schonwas es da tut. Wenn da Werte zwischen drin fehlen hat das immer einen Grund!

0
ZaoDaDong  08.06.2021, 10:00
@dieTrolle

Darum die IDs in einer extra tabelle speichern, oder eben eine Sequenz nutzen.
Sequenzen sind schon besser, selber sowas zu verwalten geht in der regel schief.

Ich arbeite tatsächlich mit propietärer Software, bei der alle IDs in einer extra ID-Tabelle entsprechend festgehalten werden. Würde eher davon abraten das heute noch so zu machen.

0
dieTrolle 
Fragesteller
 08.06.2021, 10:05
@showgirl1

Die Werte zwischen drin sind mit wurscht. Das Ganze spielt sich am Ende ab. Bei der Eingabe soll dem Nutzer angezeigt werden welche Id er beschreibt. Aus Einträgen und der Id wird eine Klassifizierung gebildet die den Datensatz deffiniert und zur leichteren Auffindung des Datensatzes dienen soll.

0