sql >> Database >  >> RDS >> Mysql

Hoe waarden van twee rijen in MySQL te wisselen zonder de unieke beperking te schenden?

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 ;


  1. kan geen verbinding maken met mysql-database in Ubuntu

  2. Lopend totaal berekenen in roodverschuiving

  3. SQL Server Fuzzy Search met Percentage van overeenkomst

  4. Inleiding tot SQL