erste freie Nummer für neuen Datensatz

Robert Steichele

Erfahrenes Mitglied
Der Titel umschreibt nur schlecht meine Frage, weiß aber nicht wie ich es besser ausdrücken soll.

Ich habe folgendes Problem. In unserer Firma betreiben wir eine MySQL-Datenbank zur Verwaltung unserer Artikel. Per PHP wird darauf zugegriffen.
Wenn jetzt ein neuer Artikel angelegt wird, ermittelt das Skript die höchste ID und gibt dem neuen Artikel diese ID+1 als ID.
Wenn jetzt allerdings Artikel gelöscht werden, gibt es freie IDs unterhalt der momentan höchsten. Diese sollen nach Wunsch meines Chefs zuerst verwendet werden.

Wie kann ich also die erste freie ID ermitteln?
 
Diese Abfrage gibt Dir immer die 1. freie Nummer einer Lücke:

Code:
select a.id+1
from artikel a
where not exists (select b.id
                          from artikel b
                          where a.id+1 = b.id)
order by a.id+1
 
Hallo,

auf Deutsch übersetzt:

Wähle diejenigen ids (SELECT a.id) aus der Artikeltabelle (FROM artikel a), für die es keine Zeile (WHERE NOT EXISTS) in der Artikeltabelle gibt (SELECT b.id FROM artikel b), deren id um eins größer ist (WHERE a.id+1 = b.id). Erhöhe diese selektieren ids um 1 (+1) und gib sie aufsteigend sortiert zurück (ORDER BY a.id+1).

Somit erhältst du als erste Zeile des Ergebnisses die niedrigste, noch nicht besetzte id.

Allerdings braucht man hierfür nicht unbedingt einen Subselect. Ein JOIN tut es auch:
Code:
SELECT `r`.`id` + 1
FROM `artikel` `r`
LEFT JOIN `artikel` `l` ON (`l`.`id` = `r`.`id` + 1)
WHERE `l`.`id` IS NULL
ORDER BY `r`.`id`
LIMIT 1

Abgesehen davon halte ich es nicht für allzu sinnvoll, bereits verwendete ids erneut zu vergeben. Genau genommen fällt mir gerade auch überhaupt kein Grund ein, warum man dies tun sollte.

Grüße,
Matthias
 
Robert Steichele hat gesagt.:
Da steig ich jetzt nicht richtig dahinter, könntest du mir das erklären?

Matthias hat das sehr gut erklärt, ich hab dem nichts hinzuzufügen. Ob du das mit einem Join oder einem Subselect machst, musst du probieren. Unter Oracle ist ein Subselect um ein vielfaches schneller.
 
Zuletzt bearbeitet:
Danke für eure schnellen Antworten, werde es schnellstmöglich testen.

Mein Chef möchte diese Nummern wieder verwenden, da unser Lager danach sortiert ist. Wenn jetzt Artikel wegfallen entstehen in den Regalen Lücken und man müsste ständig die anderen Artikel wieder zusammenschieben.
 
Für sowas führt man eine nummerierte Lagerposition ein und verwendet nicht die ID eines Artikels.
Die Lagerposition ist dann jederzeit veränderbar.
Die Lageroptimierung sollte sich nicht nach der Reihenfolge der Artikeleingabe in die Datenbank richten. :confused:

Gruß hpvw
 
Zurück