Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Dreieckstausch? (Daten 2er Datensätze vertauschen) (https://www.delphipraxis.net/84586-dreieckstausch-daten-2er-datensaetze-vertauschen.html)

yankee 18. Jan 2007 21:36

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:
id  spalte
1      3
2      4
Jetzt will ich den Wert von "Spalte" der beiden Datensätze vertauschen, damit die Tabelle nachher so aussieht:
Code:
id  spalte
1      4
2      3
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?

Ich habe schonmal an sowas gedacht:

SQL-Code:
UPDATE tabelle SET spalte=IF(spalte=4,3,4) WHERE id=3 OR id=4
Aber das geht natürlich so auch nicht. Ich müsste quasi nur dafür den key einmal kurz deaktivieren...

Oder sollte ich bei sowas doch lieber einfach einen KEY nehmen statt einen UNIQUE KEY?
Ist UNIQUE KEY überhaupt Geschwindigkeitsmässig ein Vorteil?

mkinzler 19. Jan 2007 05:34

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.

MatthiasR 28. Jul 2009 13:07

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).

joachimd 28. Jul 2009 13:34

Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
 
Zitat:

Zitat von MatthiasR
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).

Da die Ausführungsreihenfolge nicht fest steht (SQL ist mengen, nicht satzorientiert), bleibt nur der Weg über temporäre Speicherung.

MatthiasR 28. Jul 2009 13:41

Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
 
Zitat:

Zitat von joachimd
Zitat:

Zitat von MatthiasR
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).

Da die Ausführungsreihenfolge nicht fest steht (SQL ist mengen, nicht satzorientiert), bleibt nur der Weg über temporäre Speicherung.

Also nochmal zum Verständnis:
SQL-Code:
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;
Das ganze noch in ne Transaktion verpackt. Eleganter also nicht möglich?

DeddyH 28. Jul 2009 13:46

Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
 
Wäre das nicht ein guter Anwendungsfall für eine SP?

MatthiasR 28. Jul 2009 13:55

Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
 
Zitat:

Zitat von DeddyH
Wäre das nicht ein guter Anwendungsfall für eine SP?

Bin noch nicht so bewandert, was Stored Procedures angeht. Du meinst also eine SP, die die Werte einer bestimmten Spalte zweier bestimmter Datensätze für einen austauscht? Welchen Aufbau würdest du vorschlagen? Bzw. welche Parameter sollte die SP haben? Man muss ja einerseits übergeben, um welche Spalte es sich handelt, andererseits, um welche beiden Datensätze. Wie würdest du das machen?

DeddyH 28. Jul 2009 14:00

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: http://stackoverflow.com/questions/4...d-witho#484787 [/edit]

yankee 28. Jul 2009 14:31

Re: Dreieckstausch? (Daten 2er Datensätze vertauschen)
 
Zitat:

Zitat von DeddyH
[..]zumal ich auch nicht weiß, um welches DBMS es hier geht.[..]

Zitat:

Zitat von MatthiasR
[..]Bei mir kommt PostgreSQL zum Einsatz[..]

Zitat:

Zitat von DeddyH
http://stackoverflow.com/questions/484040/swapping-the-2-rows-in-ms-sql-server-retaining-the-original-primary-key-and-witho#484787

Dieses Beispiel ist ähnlich wie das IF-Konstrukt in meinem Beitrag oben: Es funtkioniert nur, wenn der Wert, der geändert werden soll kein Unique key hat. Oder habe ich da was übersehen?

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...

DeddyH 28. Jul 2009 15:10

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 20:42 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz