Vinzenz Mai: mySql-DB Positionskampf

Beitrag lesen

Hallo Gustl,

Wo ist das Problem? Wahrscheinlich in Deiner MySQL-Version, die Du uns einfach verschweigst. Das ganze ist in drei Schritten zu erledigen

Sorry: MySQL-Client-Version: 5.0.30

die Client-Version interessiert weniger. Wichtig ist vor allem die Serverversion, denn diese entscheidet, was der Server kann. Es liegt zwar die Vermutung nahe, dass es ebenfalls eine 5er-Version ist (derzeit ist in der stabilen 5.0-Serie 5.0.27 aktuell).

Du bekommst die Serverversion z.B. über das MySQL-proprietäre SQL-Statement:

SELECT VERSION()

heraus.

Ich hatte folgendes vor: Setzte pos von INT auf FLOAT.

Oh je. Wie willst Du das tun? Warum willst Du das tun?

Wenn ich nun das Bild auf eine neue pos setzen will, z.B. 8 dann setze ich den künstlichen Wert auf 7.5, also nach 7. das ganze neu nach ORDER BY pos holen und neu durchzählen.

ORDER BY zählt nichts durch. ORDER BY sortiert. Verabschiede Dich von der Vorstellung, dass Datensätze in einer Datenbank richtig umsortiert würden.

Ich bin übrigens SQL-Anfänger

Du hattest neulich irgendwelche Perl-SQL-Fragen ;-)

also natürlich interessierts mich wo es bei meinem lösungsansatz hapert ...

Dein Lösungsansatz ist völlig falsch und ungeeignet. Was hast Du an meinem Lösungsansatz nicht verstanden? Dein Lösungsansatz hat mit meinem überhaupt nichts gemeinsam (außer eventuell dem künstlichen Wert).

  • Setze die Position von Pos 25 auf einen künstlichen Wert
      (eine UPDATE-Anweisung)

Die Spalte hat den Datentyp SMALLINTEGER. Ich bezweifle, dass Du als Position den Wert 0 verwendest. Verwende also 0 für Dein "Zwischenspeichern":

~~~sql UPDATE bildinfo
  SET pos = 0      -- der künstliche Wert als Zwischenspeicher
  WHERE pos = 25   -- der zu verschiebende Wert

  

> > - Erhöhe die Position von pos 24 bis pos 5 um 1  
> >   (eine UPDATE-Anweisung)  
  
  ~~~sql
UPDATE bildinfo  
  SET pos = pos + 1           -- Alle Einträge  
  WHERE pos BETWEEN 5 AND 25  -- zwischen 5 und 25 (25 ist nicht mehr belegt :-))  
                              -- rutschen eins runter
  • Setze die Position vom künstlichen Wert auf pos 5
      (eine UPDATE-Anweisung)

~~~sql UPDATE bildinfo
  SET pos = 5                 -- Setze den Eintrag aus dem "Zwischenspeicher"
  WHERE pos = 0               -- auf Position 5

  
Wenn Du MySQL 5.x hast, packst Du die drei Anweisungen (ja, nur drei) in eine Funktion, der Du als Übergabeparameter die Ausgangsposition und die neue Position übergibst.  
  
Du musst auswerten, ob der Eintrag nach oben (wie im Beispiel) oder nach unten verschoben wird und entsprechend reagieren. Hier kannst Du ganz normal mit bedingter Ausführung arbeiten wie in anderen Programmiersprachen auch.  
  
Weiterhin wäre es eine gute Idee (die etwas Performanz kostet), sicherzustellen, dass der hier fixe Wert des Zwischenspeichers auch unbenutzt ist - und ggf. den Wert des Zwischenspeichers dynamisch zu bestimmen MIN(spalte) - 1 oder MAX(spalte) + 1 ...  
  
Durch was bestimmen sich Deine Positionen überhaupt? Vielleicht läßt sich das auch ganz anders lösen.  
  
  
Freundliche Grüße  
  
Vinzenz