Michael Schröpl: SQL: Bedingtes Update durchführen?

Beitrag lesen

Hi Thomas,

Nun will ich möglichst mit einem einzigen SQL-Statement festestellen, ob ich vor der ID_A=1, POS=2 eine neue Position einfügen kann. Hierzu müsste ja vorher Platzgeschaffen werden, also ein Update ( "POS=POS+1" )auf die POS >= 2, die zu ID_A gehören.

das halte ich für keine tolle Idee.
Stell Dir vor, Du hast eine Million Datensätze und mußt ganz vorne einen einfügen!

Ich würde Dir empfehlen, als Sortierkriterium etwas Besseres als Integer zu verwenden.

Erinnere Dich daran, wie man mit Bäumen sortiert. Jedes Element innerhalb eines Baums ist durch seinen "Weg" eindeutig adressierbar; diese "Links-Rechts"-Kombination ist als String von Nullen und Einsen darstellbar.

Du kannst Deinen Datenvorrat als sortierte lineare Liste darstellen, indem Du ihn als balancierten Baum darstellst und dann jedem Knoten seine Baum-Adresse als Sortier-Schlüssel gibst.
Willst Du einen neuen Datensatz einfügen, dann denkst Du Dir einfach die Knotenteilung des Blattes an der Einfügeposition im Baum und änderst dabei nur genau zwei Datensätze: Den einzufügenden und denjenigen, der nun sein Bruder wird. Beim Löschen gilt das Inverse analog.

Datentyp für die Baumadresse: Ein hinreichend langer String. Dieser ist für das normale ORDER BY geeignet; er ist sogar indexierbar.

Nach hinreichend vielen Einfüge- und Lösch-Operationen tendiert Dein Baum über längere Zeit hinweg dazu, zu degenerieren; es macht also Sinn, ihn alle paar Wochen oder Monate mal wieder neu zu balancieren. Aber nicht bei jeder einzelnen Operation ...

Muss ich die Tabelle für das Update locken oder lässt MySQL während meiner Aktion sowieso niemand ran?

Das kommt m. E. auf den Tabellentreiber an - der sollte transaktionsfähig sein. (myISAM reicht beispielsweise nicht.)

Viele Grüße
      Michael

--
T'Pol: I apologize if I acted inappropriately.
V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.