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

Skift kolonneværdi med den samme kolonne i en anden post

Enkelt "bytte"-operation...

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)


Dette udvides dog ikke nemt til en tabel med swap-operationer. Dette er fordi det vil forsøge at udføre alle bytte på én gang, mens byttet faktisk skal ske i en bestemt rækkefølge...


Hvis du vil lave SWAP(@id, @new_pos), skal du enten lave en underforespørgsel eller selv deltage på bordet, du opdaterer. Det kan MySQL ikke lide, og selvom der er måder at omgå begrænsningen, gør det tingene lidt rodet...

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

(Jeg tror det vil virke)


BEMÆRK:

Begge disse antager, at BÅDE @old_pos og @new_pos, eller @id og @new_pos findes, det tjekker ikke, og vil lave noget rod, hvis de ikke findes.

Dette kan løses ved at indsætte det i en transaktion og rulle tilbage, hvis ROW_COUNT() viser, at kun 1 post er opdateret.



  1. Brug af INSERT med en PostgreSQL-database ved hjælp af Python

  2. Sådan returneres 0 i stedet for null, når du bruger COUNT i MySQL

  3. Sådan tjekker du gammel statistik

  4. Problemer med at oprette Trigger i MySQL