sql >> Databasteknik >  >> RDS >> Mysql

Hur byter man värden på två rader i MySQL utan att bryta mot unika begränsningar?

Nej. (ingen som jag kan komma på).

Problemet är hur MySQL bearbetar uppdateringar. MySQL (till skillnad från andra DBMS som implementerar UPDATE korrekt), bearbetar uppdateringar på ett trasigt sätt. Den framtvingar kontroll av UNIQUE (och andra) begränsningar efter varje enskild raduppdatering och inte - som det borde göra - efter hela UPDATE uttalandet slutförs. Det är därför du inte har det här problemet med (de flesta) andra DBMS.

För vissa uppdateringar (som att öka alla eller vissa id, id=id+1 ), kan detta lösas genom att använda - en annan icke-standard funktion - en ORDER BY i uppdateringen.

För att byta värden från två rader kan det tricket inte hjälpa. Du måste använda NULL eller ett falskt värde (som inte finns men är tillåtet i din kolumn) och 2 eller 3 satser.

Du kan också tillfälligt ta bort den unika begränsningen men jag tror inte att det är en bra idé egentligen.

Så, om den unika kolumnen är ett signerat heltal och det inte finns några negativa värden, kan du använda 2 satser som är samlade i en transaktion:

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. Php mysql pdo-fråga:fyll i variabel med frågeresultat

  2. Distribuera Django + Python 3 + PostgreSQL till AWS Elastic Beanstalk

  3. mysql välj tidsstämplar mellan a och b och returnerar alla eller 0 tidsstämplar

  4. Visa endast wordpress-underkategorier