frei Zahlen

frei Zahlen

am 05.10.2007 12:27:42 von letters

Hallo,

ich habe in einer Tabelle kundennummern gespeichert. Diese werden
automatisch vergeben. Nehmen wir mal an von 0 - 100. Jetzt wird der Kunde
mit der Nummer 22 entfernt. Meine Zahlenfolge hat nun also ein "Loch". Ich
möchte nun alos dem nächsten Kunden die freigewordene Nummer 22 verpassen.
Dazu muß ich also die erste fehlende Zahl aus einer Reihe finden. IN meinem
Fall die 22. Wie mache ich das mit mysql?

mfg

Mathias

Re: frei Zahlen

am 05.10.2007 12:43:27 von Sven Paulus

Mathias Fiedler wrote:
> ich habe in einer Tabelle kundennummern gespeichert. Diese werden
> automatisch vergeben. Nehmen wir mal an von 0 - 100. Jetzt wird der Kund=
e
> mit der Nummer 22 entfernt. Meine Zahlenfolge hat nun also ein "Loch". I=
ch
> möchte nun alos dem nächsten Kunden die freigewordene Nummer 22 verp=
assen.
> Dazu muß ich also die erste fehlende Zahl aus einer Reihe finden. IN m=
einem
> Fall die 22. Wie mache ich das mit mysql?

Warum willst Du das? Wenn Du spaeter mal nach Kunde 22 schauen sollst (z.B=
..
auf Backups o.ae.) ist dann nicht mehr klar, welcher Kunde 22 gemeint ist.
Normalerweise sollten derartige Groessen immer nur monoton steigen und
niemals reused werden.

Aber wenn es denn unbedingt sein muss:

SELECT a.id+1=20
FROM meinetabelle a=20
LEFT JOIN meinetabelle b ON a.id =3D b.id - 1=20
WHERE b.id IS NULL
LIMIT 1

Re: frei Zahlen

am 05.10.2007 13:41:26 von Christian Kirsch

Am 05.10.2007 12:43 schrieb Sven Paulus:
> Mathias Fiedler wrote:
>> ich habe in einer Tabelle kundennummern gespeichert. Diese werden
>> automatisch vergeben. Nehmen wir mal an von 0 - 100. Jetzt wird der Kunde
>> mit der Nummer 22 entfernt. Meine Zahlenfolge hat nun also ein "Loch". Ich
>> möchte nun alos dem nächsten Kunden die freigewordene Nummer 22 verpassen.

Warum? Hast Du Angst, die Kundennummern könnten ausgehen? Dann nimmt
ein Bigint unsigned.




--
Christian

Re: frei Zahlen

am 05.10.2007 14:46:48 von Gregor Kofler

Mathias Fiedler meinte:
> Hallo,
>
> ich habe in einer Tabelle kundennummern gespeichert. Diese werden
> automatisch vergeben. Nehmen wir mal an von 0 - 100. Jetzt wird der Kunde
> mit der Nummer 22 entfernt. Meine Zahlenfolge hat nun also ein "Loch". Ich
> möchte nun alos dem nächsten Kunden die freigewordene Nummer 22 verpassen.
> Dazu muß ich also die erste fehlende Zahl aus einer Reihe finden. IN meinem
> Fall die 22. Wie mache ich das mit mysql?

Vergiss es. Du fragst nach Lösungen für nichtexistente Probleme. Man
vergibt IDs nicht "erneut". Neben dem vollkommenen Fehlen eines
praktischen Nutzens handelst du dir reihenweise potentielle Probleme ein.

Etwas Literaturrecherche zu den Themen "Primärschlüssel" und
"referentielle Integrität" hilft.

Gregor


--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum

Re: frei Zahlen

am 14.10.2007 20:38:27 von letters

Am 5 Oct 2007 10:43:27 GMT schrieb Sven Paulus:

> Mathias Fiedler wrote:
>> ich habe in einer Tabelle kundennummern gespeichert. Diese werden
>> automatisch vergeben. Nehmen wir mal an von 0 - 100. Jetzt wird der Kunde
>> mit der Nummer 22 entfernt. Meine Zahlenfolge hat nun also ein "Loch". Ich
>> möchte nun alos dem nächsten Kunden die freigewordene Nummer 22 verpassen.
>> Dazu muß ich also die erste fehlende Zahl aus einer Reihe finden. IN meinem
>> Fall die 22. Wie mache ich das mit mysql?
>
> Warum willst Du das? Wenn Du spaeter mal nach Kunde 22 schauen sollst (z.B.
> auf Backups o.ae.) ist dann nicht mehr klar, welcher Kunde 22 gemeint ist.
> Normalerweise sollten derartige Groessen immer nur monoton steigen und
> niemals reused werden.
>
> Aber wenn es denn unbedingt sein muss:
>
> SELECT a.id+1
> FROM meinetabelle a
> LEFT JOIN meinetabelle b ON a.id = b.id - 1
> WHERE b.id IS NULL
> LIMIT 1

Ich möchte nicht die ID neu vergeben, dafür habe ich ein Auto Increment.
Aber ich habe eine eigene interne Kundennummer und die soll eben so
vergeben werden. Dein Ansatz war absolut richtig. Danke.

mfg

Mathias