![]() |
Datenbank: MySQL • Version: 5.0.27 • Zugriff über: unwichtig
Dreieckstausch? (Daten 2er Datensätze vertauschen)
Hi @ll,
Ich habe mal vereinfacht dargestellt folgende Tabelle: id INT auto_inkrement spalte INT PRIMARY KEY(id) UNIQUE KEY(spalte) Mit volgendem Inhalt:
Code:
Jetzt will ich den Wert von "Spalte" der beiden Datensätze vertauschen, damit die Tabelle nachher so aussieht:
id spalte
1 3 2 4
Code:
Gibt es für dieses Problem irgend eine schlauere Lösung, als Spalte bei einem der beiden erstmal auf einen temporären Wert, der auch ganz sich sonst nicht in der Tabelle vorkommt zu setzen, dann den zweiten Wert auf den ersten upzudaten und dann wieder den ersten auf den zweiten?
id spalte
1 4 2 3 Ich habe schonmal an sowas gedacht:
SQL-Code:
Aber das geht natürlich so auch nicht. Ich müsste quasi nur dafür den key einmal kurz deaktivieren...
UPDATE tabelle SET spalte=IF(spalte=4,3,4) WHERE id=3 OR id=4
Oder sollte ich bei sowas doch lieber einfach einen KEY nehmen statt einen UNIQUE KEY? Ist UNIQUE KEY überhaupt Geschwindigkeitsmässig ein Vorteil? |
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Um der Wert einer Spalte unique ist hat m.E. vorallem damit zu tun, was der Wert darstellt. Es wird so ja verhindert das ein Wert mehrfach vorkommt. Wenn das sichergestellt werden soll, dann ist diese Beschränkung richtig, sonst nicht.
|
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Gleiche Frage stelle ich mir gerade auch.
Wie geht so etwas eleganter als mithilfe eines temporären Wertes? Wer kann helfen? Bei mir kommt PostgreSQL zum Einsatz, sollte aber für das Problem nicht relevant sein, das ist nicht DB-spezifisch (solange UNIQUE-Constraint vorhanden). |
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Zitat:
|
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Zitat:
SQL-Code:
Das ganze noch in ne Transaktion verpackt. Eleganter also nicht möglich?
UPDATE tabelle
SET spalte = <TEMPORÄRER WERT> WHERE id = 1; UPDATE tabelle SET spalte = 4 WHERE id = 1; UPDATE tabelle SET spalte = 3 WHERE id = 2; |
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Wäre das nicht ein guter Anwendungsfall für eine SP?
|
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Zitat:
|
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Ich bin auch kein solcher Experte, als dass ich so eine SP ohne Nachlesen aus dem Hut hier tippen könnte, zumal ich auch nicht weiß, um welches DBMS es hier geht. Aber prinzipiell sollte es doch möglich sein, die Spalte sowie die beiden Werte des PK als Parameter zu übergeben. Der PK müsste dann vermutlich halt nummerisch sein.
[edit] Hab hier ein Beispiel für MS SQL gefunden: ![]() |
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Zitat:
Zitat:
Zitat:
Eine Stored Procedure für den Fall würde zwar die Komplexität woanders hin verlegen und die Abfrage auch beschleunigen, wenn das DBMS über ein Netzwerk angesprochen wird, da weniger Daten verschoben werden müssen. Aber das eigentliche Problem löst es wohl nicht, da auch hier immer nur Zugriff auf eine Zeile auf mal besteht und somit der unique key auf jeden Fall blockiert. Der Unique key lässt sich auch nicht temporär deaktivieren (zumindest in mysql) (bzw. nur mit ALTER TABLE DROP KEY ... Was entsprechend dauern kann und sowieso eher ähm... zu Problemen anderswo führen kann. EDIT: Natürlich kann die Version mit dem temporären Wert auch Probleme verusachen. Was ist wenn zwei Threads gleichzeitig den gleichen temporären Wert nutzen wollen um zwei Zeilen zu tauschen. Dank Transaktionen würde das Ergebnis zwar nicht willkürlich sein, aber was macht das DBMS in einer solchen Situation? Lockt der zweite Thread solange, bsi der erste fertig ist, oder wird direkt zurückgerollt? Das könnte DBMS spezifisch sein... |
Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
Man sollte auch den ganzen Thread lesen :roll: . Gut, bei einem UNIQUE KEY wird die Sache schwierig, da fällt mir auf Anhieb auch keine einfache Lösung ein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz