AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Dreieckstausch? (Daten 2er Datensätze vertauschen)
Thema durchsuchen
Ansicht
Themen-Optionen

Dreieckstausch? (Daten 2er Datensätze vertauschen)

Ein Thema von yankee · begonnen am 18. Jan 2007 · letzter Beitrag vom 29. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

Dreieckstausch? (Daten 2er Datensätze vertauschen)

  Alt 18. Jan 2007, 22:36
Datenbank: MySQL • Version: 5.0.27 • Zugriff über: unwichtig
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:

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?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 19. Jan 2007, 06:34
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.
Markus Kinzler
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#3

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

  Alt 28. Jul 2009, 14:07
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).
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 28. Jul 2009, 14:34
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#5

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

  Alt 28. Jul 2009, 14:41
Zitat von joachimd:
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 28. Jul 2009, 14:46
Wäre das nicht ein guter Anwendungsfall für eine SP?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#7

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

  Alt 28. Jul 2009, 14:55
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 28. Jul 2009, 15:00
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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#9

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

  Alt 28. Jul 2009, 15:31
Zitat von DeddyH:
[..]zumal ich auch nicht weiß, um welches DBMS es hier geht.[..]
Zitat von MatthiasR:
[..]Bei mir kommt PostgreSQL zum Einsatz[..]
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...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 28. Jul 2009, 16:10
Man sollte auch den ganzen Thread lesen . Gut, bei einem UNIQUE KEY wird die Sache schwierig, da fällt mir auf Anhieb auch keine einfache Lösung ein.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.
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