Mehrere Datensätze gelichzeitig updaten
Frank
- php
Ja, ich bin es schon wieder.
Habe diesmal folgendes Problem.
Habe eine Tabelle mit drei zeilen die mehrer Daten enthalten, unter anderem eine pos, die wie folgt ist.
1
2
3
nun möchte ich das aus 2->1, 3->2 und aus 1->3 wird.
wie kann ich das am besten machen.
Mit einer Schleife würden sich irgendwo die zahlen mit WHERE überschneiden.
Deshalb wollte ich alle 3 mit einmal ändern. Wie muss dann dazu die SQL anweisung aussehen?
$sql="UPDATE Tabelle Set pos='1' where pos='2'"; usw.
hi,
nun möchte ich das aus 2->1, 3->2 und aus 1->3 wird.
wie kann ich das am besten machen.
Mit einer Schleife würden sich irgendwo die zahlen mit WHERE überschneiden.
Wieso(,) haben deine Datensätze keine eindeutige ID?
gruß,
wahsaga
Die eindeutige ID ist nicht wirklich nötig, da die pos eindeutig ist und nur einmal vorkommt. Desweiteren habe ich nur einen Datensatz den ich geändert habe, und demzufolge die anderen auch geändert werden müssen.
Ich lese ja die anderen Daten nicht aus.
Ist es möglich die SQL anweisung so zu gestalten, das ich alles mit einmal ändern kann?
hi,
Die eindeutige ID ist nicht wirklich nötig, da die pos eindeutig ist und nur einmal vorkommt.
Dies hast du also durch einen UNIQUE-Constraint auf pos sichergestellt?
Dann kannst du ja gar nicht einem weiteren Datensatz die pos 2 verpassen, solange noch ein anderer diese hat - da wäre also sowieso erst mal ein "Dreieckstausch" erforderlich.
Ausserdem sehe ich nicht, warum du dich dadurch bemüssigt fühlst, auf so etwas sinnvolles wie eine Datensatz-ID zu verzichten.
Desweiteren habe ich nur einen Datensatz den ich geändert habe, und demzufolge die anderen auch geändert werden müssen.
Also bedeutet einen ändern (idR.) alle ändern.
Ich lese ja die anderen Daten nicht aus.
Zumindest die bisherige pos und ID könntest du auslesen, und dann damit der Reihe nach die nötigen Updates machen, ohne dadurch irgendwelche Verluste oder Inkonsistenzen zu riskieren.
Ist es möglich die SQL anweisung so zu gestalten, das ich alles mit einmal ändern kann?
Über den Umweg einer temporären Tabelle vielleicht - ansonsten kann ich mir kaum eine Lösung vorstellen, aber mal sehen, vielleicht haben andere ja noch Vorschläge.
gruß,
wahsaga
Huhu Frank,
Die eindeutige ID ist nicht wirklich nötig, da die pos eindeutig ist und nur einmal vorkommt.
Du willst den Wert für "pos" nachträglich verändern, also ist er nicht eindeutig im Sinne einer ID.
Ist es möglich die SQL Anweisung so zu gestalten, das ich alles mit einmal ändern kann?
Benutze ggf. eine zusätzliche Spalte "new_pos".
Dann ermittelst Du in einem ersten Schritt jeweils anhand von "pos" den Wert für "new_pos".
Im zweiten Schritt aktualisierst Du z.B. per
"UPDATE DeineTabelle set pos = new_pos WHERE 1".
Ggf. kann man Dein Vorhaben auch weniger umständlich lösen, dazu müsste man aber wissen was Du eigentlich erreichen möchtest.
Viele Grüße
lulu
Ggf. kann man Dein Vorhaben auch weniger umständlich lösen, dazu müsste man aber wissen was Du eigentlich erreichen möchtest.
Das ganze ist für eine Navigation. Und Pos gibt die Position in der Navigationspalte an.
Und mit einer Admin-Site, um die es gerade geht soll dem Admin die möglichkeit gegeben werden die Reihenfolge der Navigationselemente zu verändern.
Die Tabelle.
index,pos,bild1,breite1,hoehe1,bild2,breite2,hoehe2,bild3,breite3,hoehe3,link,beschreibung
index= zum aufruf der des links zb.:Index.php?site=index
link ist optional
pos= Position innerhalb der Navigation
der rest erklärt sich selbst.
Wer vorschläge hat, nur her damit.
Hello,
Welche MySQL(?) Version verwendest du? Hast du schonmal StoredProcedures eingesetzt? Ist zwar im Gegensatz zu einer Routine in PHP nur eine Verlagerung in die Datenbank, würde aber damit für dein PHP-Skript lediglich einen einzigen Aufruf bedeuten, die Logik läge in der Datenbank.
MfG
Rouven
Hallo,
nun möchte ich das aus 2->1, 3->2 und aus 1->3 wird.
wie kann ich das am besten machen.
Mit einer Schleife würden sich irgendwo die zahlen mit WHERE
das beste wird es sein wenn Du eine Spalte hinzufügst, z.B. "reihenfolge" und dann bei der Ausgabe ein Eingabefeld hernimmst welches die Zahlen für die Reihenfolge der Ausgabe aufnimmt.
ID - Text - Reihenfolge
1 - Datensatz 1 - 1
2 - Datensatz 2 - 2
usw...
beim speichern dann die Datensatz IDs mit einer Schleife durchlaufen und die Reihenfolge Werte dazu speichern. Die Darstellung bei der Ausgabe kannst Du dann über ORDER BY reihenfolge machen.
Gruß Helmuth
Hallo Frank,
grundsätzlich ist es keine gute Idee, auf eine sinnvolle Schlüsselspalte zu verzichten und statt dessen gerade eine Spalte, deren Werte sich öfter ändern können, dafür zu nehmen.
Habe eine Tabelle mit drei zeilen die mehrer Daten enthalten, unter anderem eine pos, die wie folgt ist.
1
2
3nun möchte ich das aus 2->1, 3->2 und aus 1->3 wird.
Dieses spezielle Problem lässt sich natürlich leicht mit einer Addition und einer Modulo-Operation lösen:
UPDATE tabelle SET pos = (pos + 2) % 3
Für eine x-beliebige Umordnung einer beliebigen Anzahl von Positionen dürfte sich jedoch nicht so einfach eine Lösung finden :-)
Nimm daher, wie bereits mehrfach vorgeschlagen, eine zusätzliche Schlüsselspalte. So kannst Du nach Belieben umordnen lassen.
Freundliche Grüße
Vinzenz
PS: Was hat Deine Frage mit PHP zu tun?
grundsätzlich ist es keine gute Idee, auf eine sinnvolle Schlüsselspalte zu verzichten und statt dessen gerade eine Spalte, deren Werte sich öfter ändern können, dafür zu nehmen.
Fügen wir noch hinzu, dass eine Tabelle aus verschiedenen Gründen immer einen nicht bedeutungsbeladenen Primärschlüssel besitzen muss, dessen Wert sich _nie_ ändern darf. Was wiederum bedingt, dass der Primärschlüssel verschiedene Eigenschaften haben muss, u.a. muss er global eindeutig sein.
Deshalb wollte ich alle 3 mit einmal ändern. Wie muss dann dazu die SQL anweisung aussehen?
Du möchtest vermutlich mehrere Datensätze ändern, wobei die angewandte Änderungsregel mehrere Unterregeln enthält. Dafür gibts dann leider keine Syntax, die diesen Job mit einer einzigen SQL-Anweisung ausführen würde.