sql >> Databáze >  >> RDS >> Mysql

Jak zaměnit hodnoty dvou řádků v MySQL bez porušení jedinečného omezení?

Ne. (nic, co mě nenapadá).

Problém je v tom, jak MySQL zpracovává aktualizace. MySQL (na rozdíl od jiných DBMS, které implementují UPDATE správně), zpracovává aktualizace nefunkčním způsobem. Vynucuje kontrolu UNIQUE (a další) omezení po každé aktualizaci jednoho řádku a ne - jak by to mělo být - po celé UPDATE výpis dokončí. To je důvod, proč tento problém s (většinou) ostatních DBMS nemáte.

U některých aktualizací (např. zvýšení všech nebo některých ID, id=id+1 ), to lze vyřešit použitím - další nestandardní funkce - ORDER BY v aktualizaci.

Pro záměnu hodnot ze dvou řádků tento trik nepomůže. Budete muset použít NULL nebo falešnou hodnotu (která neexistuje, ale je ve vašem sloupci povolena) a 2 nebo 3 příkazy.

Můžete také dočasně odstranit jedinečné omezení, ale nemyslím si, že je to dobrý nápad.

Pokud je tedy jedinečný sloupec celé číslo se znaménkem a neexistují žádné záporné hodnoty, můžete použít 2 příkazy zabalené v transakci:

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. Co je MariaDB Enterprise Cluster?

  2. Odeslání formuláře pomocí <typ vstupu =tlačítko>

  3. Django odlišná skupina dotazem na dvě pole

  4. Součet součtů dvou dotazů