Mysql
 sql >> Database >  >> RDS >> Mysql

Come scambiare i valori di due righe in MySQL senza violare il vincolo univoco?

No. (nessuno a cui mi viene in mente).

Il problema è come MySQL elabora gli aggiornamenti. MySQL (a differenza di altri DBMS che implementano UPDATE correttamente), elabora gli aggiornamenti in modo non corretto. Impone il controllo di UNIQUE (e altri) vincoli dopo ogni singolo aggiornamento di riga e non - come dovrebbe fare - dopo l'intero UPDATE la dichiarazione si completa. Ecco perché non hai questo problema con (la maggior parte) degli altri DBMS.

Per alcuni aggiornamenti (come aumentare tutti o alcuni ID, id=id+1 ), questo può essere risolto utilizzando - un'altra funzionalità non standard - un ORDER BY nell'aggiornamento.

Per scambiare i valori da due righe, quel trucco non può aiutare. Dovrai usare NULL o un valore fasullo (che non esiste ma è consentito nella tua colonna) e 2 o 3 affermazioni.

Potresti anche rimuovere temporaneamente il vincolo univoco, ma non credo sia davvero una buona idea.

Quindi, se la colonna univoca è un numero intero con segno e non sono presenti valori negativi, puoi utilizzare 2 istruzioni racchiuse in una transazione:

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 ;