mySQL: SELECT und UPDATE zusammenfassen?

Hallo,

ich habe momentan das Problem, dass ich auf dem Webserver, den ich nutze, das „LOCK TABLES“-Privileg nicht besitze. Ich hoffe ja, dass sich das ändern lässt, aber falls nicht, hier eine Frage, mit deren positiver Antwort sich das Locken vielleicht umgehen ließe:

Ich habe eine Tabelle, in die ich einen neuen Datensatz einfüge. Dieser Datensatz bezieht sich auf einen anderen und soll daher „unter“ diesem einsortiert werden, sprich, er übernimmt dessen Positionsnummer (PN), woraufhin der bezogene Datensatz dessen PN erhöht bekommt. Gleiches passiert natürlich mit allen Datensätzen, die eine höhere PN haben als der bezogene Datensatz ursprünglich hatte.

Das Vorgehen ist also wie folgt (Pseudo-Code):

 SELECT PN AS P WHERE ID= BezugsID
 UPDATE PN=PN+1 WHERE PN\>=P
 UPDATE PN=P WHERE ID= NeueID

Dass hier kein anderer Prozess mit dem gleichen Anliegen dazwischenfunken darf, ist klar, und momentan unterbinde ich das, indem ich die Tabelle vorher locke und erst danach wieder freigebe.

Die Frage ist nun, ob man diese drei Vorgänge irgendwie in eine einzige Aktion packen kann. Ich wüsste nicht, wie das gehen sollte, sei es nun mit wilden JOINs, Sub-Selects oder was auch immer. Aber vielleicht hat ja trotzdem jemand eine Idee, wie man ein „Zwischenergebnis“ erhalten und weiterverarbeiten kann, denn darauf scheint es hier hinauszulaufen.

Danke,
Kristian

Moin, Kristian,

Gleiches passiert
natürlich mit allen Datensätzen, die eine höhere PN haben als
der bezogene Datensatz ursprünglich hatte.

das hieße ja, dass im Extremfall alle Sätze der Datenbank geändert würden. Ist das so beabsichtigt?

Gruß Ralf

das hieße ja, dass im Extremfall alle Sätze der Datenbank
geändert würden. Ist das so beabsichtigt?

Ja, das stimmt. Allerdings ist erfolgt das mit einer sehr geringen Wahrscheinlichkeit, zweitens geht das ziemlich schnell, was Tests bis jetzt belegen konnten, und drittens ist das bei anderen Verfahren wie „Nested Set“ oderso auch nicht anders.

Insofern ist das in meinen Augen eine recht simple und transparente Lösung, auch wenn es möglicherweise bessere gibt. Der Aufwand wird meines Erachtens aber eher höher als geringer.

Achso, Sinn der Sache ist, eine sortierte Ausgabe zu optimieren, denn Ausgaben erfolgen häufiger als Eingaben, und rekursive Abfragen dauern ewig (das wäre die Alternative, wenn man die Sortierung bei der Ausgabe vornimmt).

Kristian

Hi Kristian,

rekursive Abfragen dauern ewig (das wäre die Alternative, wenn
man die Sortierung bei der Ausgabe vornimmt).

dieser Satz lässt mich befürchten, dass ich deine Frage nicht im Mindesten verstanden habe. Möglicherweise wäre es leichter, über den fachlichen Hintergrund zu reden als über die technischen Möglichkeiten der Umsetzung.

Gruß Ralf

dieser Satz lässt mich befürchten, dass ich deine
Frage nicht im Mindesten verstanden habe.

Sowas kommt vor :wink:

Möglicherweise wäre es leichter, über den
fachlichen Hintergrund zu reden als über die
technischen Möglichkeiten der Umsetzung.

Kann sein, aber heute hat sich die Sache glücklicherweise erübrigt, da ich vom Provider das LOCK-Recht eingeräumt bekommen habe. Entscheide DU, ob sich die Mühe lohnt, den fachlichen Hintergrund noch zu klären :wink:

Danke jedenfalls und schönes Wochenende,
Kristian