[mySQL] Zahlen automatisch um 1 hochzählen

Lolliball

Active member
ID: 334320
L
25 November 2008
27
1
hallo alle miteinander,

also, ich hab schon gesucht, aber nichts gefunden, was mein problem lösen könnte.

das Problem:

ist es möglich, dass automatisch innerhalb einer tabelle ein wert (hier zahl) um 1 erhöht wird, wenn die schon eingetragenen werte entweder gleich oder größer sind, fall der neue eintrag gleich ist?

erläuterung:

eine speisekarte ist in gruppen aufgeteilt. die positionen der speisen werden jedoch durchgehend nummeriert und können selbst bestimmt werden.

die tabelle ist so aufgebaut:

ID | Position | Name | Preis | Rubrik

Position ist eine ganze Zahl.

Wenn die Speisen eingetragen werden, dann kann selbst bestimmt werden, welche position nun die jeweilige speise haben soll.

also z.bsp.

rubrik = fleisch
pos. 1 = schnitzel
pos. 2 = steak
pos. 3 = hackbraten

rubrik = salat
pos. 4 = tomatensalat
pos. 5 = gurgensalat
...

jetzt soll jedoch eine speise hinzukommen und soll auf position 4 eingetragen werden.

also sollte das nun so aussehen:

rubrik = fleisch
pos. 1 = schnitzel
pos. 2 = steak
pos. 3 = hackbraten
pos. 4 = gulasch

rubrik = salat
pos. 5 = tomatensalat
pos. 6 = gurgensalat

...

das würde nun bedeuten, dass ab der alten position 4 und den nachfolgenden speisen jeweils die position mit hand bei jedem datensatz geändert werden müsste.
auto_increment funktioniert in diesem fall nicht.

versteht ihr mein problem?

ich hab schon alles mögliche versucht, aber geht alles nicht.
bin auch nicht gerade der experte, was mysql und php betrifft.
 
Das geht relativ einfach mit folgenden Schritten (Achtung teilweise Pseudocode!)
  • Überprüfen, ob Pos. 4 schon vergeben ist
  • Wenn nein, Datensatz einfügen und fertig!
  • Wenn doch, "UPDATE speisekarte SET Position=Position+1 WHERE Position >= 4"
  • Neuen Datensatz einfügen und fertig
Evtl. könnte man sich da wenigstens eine Query sparen, indem man Position als UNIQUE definiert und dann mit "ON DUPLICATE KEY" arbeitet, aber das krieg ich so auf die Schnelle auch nicht hin...
 
besten dank für den tip. es funktioniert wunderbar :D.

nun hab ich nur noch ein kleines problem, wenn ein datensatz mittendrin gelöscht wird, dass dann die nachfolgenden positionen wieder um 1 verringert werden.

aber ich hoffe mal, dass ich das auch noch hinbekomme.
 
PHP:
UPDATE speisekarte SET position = position - 1 WHERE position > DELETED_ID

Greetz

paddya
 
danke, aber hatte auch schon den einfall. es funktioniert jedoch nur, wenn die id der nächsten tatsächlich größer ist.
habe ich aber nachträglich eine position eingefügt und will die dann wieder löschen, gehts nicht, da deren id nun größer ist.

na ja. aber es sortiert, auch wenn die positionen nun lücken aufweisen.
ich habs in der anzeige der speisekarte mit einer variablen gelöst.
$n=1

und füge in der ersten spalte, da die fortlaufende nummerierung angezeigt werden soll $n++ ein.
die speisen sind nun in der gewünschten reihenfolge und die positionen in der anzeige fortlaufend.
 
danke, aber hatte auch schon den einfall. es funktioniert jedoch nur, wenn die id der nächsten tatsächlich größer ist.
habe ich aber nachträglich eine position eingefügt und will die dann wieder löschen, gehts nicht, da deren id nun größer ist.

Stimmt, da kann es zu Problemen führen. Wenn du eine Position zwischen drin einfügst, musst du natürlich die gegenteilige Query ausführen:

PHP:
UPDATE speisekarte SET position = position + 1 WHERE position >= INSERTED_ID

na ja. aber es sortiert, auch wenn die positionen nun lücken aufweisen.
ich habs in der anzeige der speisekarte mit einer variablen gelöst.
$n=1

und füge in der ersten spalte, da die fortlaufende nummerierung angezeigt werden soll $n++ ein.
die speisen sind nun in der gewünschten reihenfolge und die positionen in der anzeige fortlaufend.

Das ist in meinem Augen sowieso die vernünftigere Lösung und spart einiges an Datenbank-Gefrickel ;)

Greetz

paddya