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

Hvordan bytter man værdier af to rækker i MySQL uden at overtræde unikke begrænsninger?

Nej. (ingen, jeg kan komme i tanke om).

Problemet er, hvordan MySQL behandler opdateringer. MySQL (til forskel fra andre DBMS, der implementerer UPDATE korrekt), behandler opdateringer på en ødelagt måde. Det gennemtvinger kontrol af UNIQUE (og andre) begrænsninger efter hver enkelt rækkeopdatering og ikke - som det burde gøre - efter hele UPDATE erklæring afsluttes. Det er derfor, du ikke har dette problem med (de fleste) andre DBMS.

For nogle opdateringer (som at øge alle eller nogle id'er, id=id+1 ), kan dette løses ved at bruge - en anden ikke-standard funktion - en ORDER BY i opdateringen.

For at bytte værdier fra to rækker kan det trick ikke hjælpe. Du skal bruge NULL eller en falsk værdi (som ikke findes, men som er tilladt i din kolonne) og 2 eller 3 udsagn.

Du kan også midlertidigt fjerne den unikke begrænsning, men jeg synes egentlig ikke, det er en god idé.

Så hvis den unikke kolonne er et signeret heltal, og der ikke er nogen negative værdier, kan du bruge 2 udsagn pakket ind 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. Sådan beregnes forskellen mellem to datoer i SQLite

  2. Er det muligt at henvise til kolonnenavne via bindevariabler i Oracle?

  3. Få den aktuelle tidszone for serveren i SQL Server (T-SQL)

  4. Ved at bruge Docker får jeg fejlen:SQLSTATE[HY000] [2002] Ingen sådan fil eller mappe