Nee. (geen dat ik kan bedenken).
Het probleem is hoe MySQL updates verwerkt. MySQL (in verschil met andere DBMS die UPDATE
implementeren) correct), verwerkt updates op een gebroken manier. Het dwingt controle van UNIQUE
. af (en andere) beperkingen na elke afzonderlijke rij-update en niet - zoals het zou moeten doen - na de hele UPDATE
verklaring is voltooid. Daarom heb je dit probleem niet met (de meeste) andere DBMS.
Voor sommige updates (zoals het verhogen van alle of sommige ID's, id=id+1
), kan dit worden opgelost door - een andere niet-standaard functie - een ORDER BY
. te gebruiken in de update.
Voor het verwisselen van de waarden van twee rijen, kan die truc niet helpen. U moet NULL
. gebruiken of een valse waarde (die niet bestaat maar wel in je kolom is toegestaan) en 2 of 3 uitspraken.
Je zou de unieke beperking ook tijdelijk kunnen verwijderen, maar ik denk niet dat dat echt een goed idee is.
Dus als de unieke kolom een geheel getal met teken is en er zijn geen negatieve waarden, dan kunt u 2 verklaringen gebruiken die in een transactie zijn verpakt:
START TRANSACTION ;
UPDATE tasks
SET priority =
CASE
WHEN priority = 2 THEN -3
WHEN priority = 3 THEN -2
END
WHERE priority IN (2,3) ;
UPDATE tasks
SET priority = - priority
WHERE priority IN (-2,-3) ;
COMMIT ;