mySQL: Zeilen verschieben?

Moin,

kann man eigentlich per SQL Datensätze verschieben oder gleich an einer bestimmten Position (z.B. hinter dem Datensatz mit der ID 5) einfügen? Hintergrund ist eine Baumstruktur, die beliebig tief sein kann. Wenn ich die darstellen will, dauert das ziemlich lange, da ich rekursiev durch die ganze Tabelle durchsteigen muss. Wäre sie von vornherein „richtig“ sortiert, könnte ich sie einfach einsaugen und direkt wieder ausgeben. So stelle ich mir das jedenfalls vor.

Danke,
Kristian

PS:
Parallel werde ich mal gucken, ob die Sache mit einem Index besser wird. Habe das aber noch nicht ganz durchschaut und weiß nicht, ob das das richtige Instrument ist im konkreten Fall.

Hi,
in einer Datenbank ist die physische Anordnung der Datensätze nicht wichtig und in der Regel auch nicht bestimmbar.

Wie sortiert die Daten ausgegeben werden erfolgt in SQL über die „ORDER BY“ Anweisung.

Gruss
Quaser

in einer Datenbank ist die physische Anordnung der Datensätze
nicht wichtig und in der Regel auch nicht bestimmbar.

Genau so hatte ich mir das bislang auch vorgestellt.

Wie sortiert die Daten ausgegeben werden erfolgt in SQL über
die „ORDER BY“ Anweisung.

Richtig, das mache ich ja auch. Aber wenn ich das ORDER BY weglasse, kommen die Daten ja auch in einer bestimmten Reihenfolge, die ich nicht für zufällig halte. In irgendeiner Weise sind die Datensätze ja in dem Datenbank-File abgelegt (in einer Text-Datenbank wäre es schlicht die Reihenfolge der Zeilen), und das sollte doch die Reihenfolge im Falle einer unsortierten Ausgabe bestimmen, oder?

Kristian

Kallo Kristian,

doch die Anordnung ist zufällig. Die meisten Tabelle sind Heap-organisiert. D.h. die Daten werden willkürlich auf die aktuelle freie Speicherseite geschrieben.

Wenn Du die Daten in der richtigen Reihenfolge eingibst, werden die meisten - aber nicht zwingend und nicht steuerbar alle - Daten sogar in der dieser Reihenfolge abgespeichert werden.

Wenn Du aber jetzt einen Datensatz änderst, bleibt er stehen, wo er war und die Reihenfolge ist zerstört. Das kann Dir sogar dadurch passieren, dass dDu durch ein SELECT eine Speicherseite in den Hauptspeicher bringst. Danach geht der nächste INSERT möglicherweise auf diese Speicherseite. Und schon wieder ist die Ordnung zerstört.

Schneller gehts evtl mit einer Index-organisierten Tabelle. Das stehen die Datensätze schon mal in der richtigen Reihenfolge. Aber auch da kann Dir der Zugriffsalgorithmus einen Strich durch die Ordnung machen, der bei einer Datenbank ja nicht von Dir kontrolliert wird sondern vom Optimizer.

Du kommst also DEFINITIV nicht am ORDER BY vorbei.

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

das ziemlich lange, da ich rekursiev durch die ganze Tabelle
durchsteigen muss. Wäre sie von vornherein „richtig“ sortiert,

Sowas tut man doch auch nicht :smile:
http://dev.mysql.com/tech-resources/articles/hierarc…
(unten) oder google mal nach „nested set“

Alexander

Sowas tut man doch auch nicht :smile:

Stimmt, aber irgendwo fängt man ja an, um es erstmal zum Laufen zu kriegen, und das tut es ja :wink: Genau in Richtung Rekursions-Vermeidung wäre übrigens meine nächste Frage heute gegangen, deren Antwort Du vielleicht unten vorweggenommen hast, mal sehen. Irgendwie muss SQL ja entsprechende Mechanismen zur Verfügung stellen, vielleicht mit irgendwelchen JOINs oderso.

http://dev.mysql.com/tech-resources/articles/hierarc…
(unten) oder google mal nach „nested set“

Ich gucke da mal rein. Vielleicht steht ja was drin, was ich bei mir applizieren kann (und was ich auch durchdringe :wink: ).
Danke.

Kristian