sql >> Databasteknik >  >> RDS >> Mysql

Byt kolumnvärde med samma kolumn i en annan post

Enkel "byte" 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)


Detta expanderar dock inte lätt till en tabell med swap-operationer. Detta beror på att det kommer att försöka göra alla byten på en gång, när de faktiskt måste ske i en viss ordning...


Dessutom, om du vill göra SWAP(@id, @new_pos) måste du antingen göra en underfråga eller själv gå med på bordet du uppdaterar. MySQL gillar inte det, och även om det finns sätt att komma runt begränsningen, gör det att saker och ting blir lite röriga...

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

(Jag tror det kommer att fungera)


OBS:

Båda dessa förutsätter att BÅDE @old_pos och @new_pos, eller @id och @new_pos hittas, det kontrolleras inte och kommer gör oreda om de inte finns.

Detta kan lösas genom att lägga det i en transaktion och återställa det om ROW_COUNT() visar att endast en post uppdateras.



  1. tomcat7:Det gick inte att ladda JDBC-drivrutinsklassen [com.mysql.jdbc.Driver]

  2. Anropar lagrade procedurer från Java

  3. Oci_connect-funktionen är odefinierad i CentOS med Oracle

  4. Åtkomst till MySql Database från PHP-fil på lokal värd