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!