sql >> Database >  >> RDS >> Mysql

Kolomwaarde omwisselen met dezelfde kolom van een ander record

Enkele "swap"-bewerking...

SWAP(@old_pos, @new_pos)

UPDATE
  my_table
SET
  position = CASE WHEN position = @old_pos THEN @new_pos ELSE @old_pos END
WHERE
  position IN (@old_pos, @new_pos)


Dit is echter niet gemakkelijk uit te breiden tot een tabel met swap-operaties. Dit komt omdat het zal proberen alle swaps tegelijk uit te voeren, terwijl de swaps in feite in een specifieke volgorde moeten gebeuren...


Als je SWAP(@id, @new_pos) wilt doen, moet je ofwel een subquery doen of zelf joinen op de tafel die je bijwerkt. MySQL houdt daar niet van, en hoewel er manieren zijn om de beperking te omzeilen, wordt het een beetje rommelig...

UPDATE
  my_table
INNER JOIN
  (SELECT position AS old_pos, @new_pos AS new_pos FROM (SELECT position FROM my_table WHERE id = @id)) AS params
    ON my_table.position IN (params.old_pos, params.new_pos)
SET
  myTable.position = CASE WHEN position = old_pos THEN new_pos ELSE old_pos END

(Ik denk dat zal werken)


OPMERKING:

Beide gaan ervan uit dat BEIDE @old_pos en @new_pos, of @id en @new_pos worden gevonden, het controleert niet en zal maak er een zooitje van als ze niet bestaan.

Dit kan worden opgelost door het in een transactie te plaatsen en terug te draaien als ROW_COUNT() laat zien dat er maar 1 record is bijgewerkt.



  1. Opmerking:gebruik van ongedefinieerde constante

  2. Hexadecimale waarden opslaan als binair in MySQL

  3. Hoe om te gaan met internationaal karakter in PHP / MySQL / Apache

  4. tel zaterdagen vóór 15 data als werkdagen en sla andere over