Mysql
 sql >> база данни >  >> RDS >> Mysql

Разменете стойността на колоната със същата колона на друг запис

Единична операция "swap"...

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)


Това обаче не може лесно да се разшири до таблица на суаповите операции. Това е така, защото ще се опита да извърши всички суапове наведнъж, докато всъщност суаповете трябва да се извършват в определен ред...


Освен това, ако искате да направите SWAP(@id, @new_pos), трябва или да направите подзаявка, или да се присъедините самостоятелно към таблицата, която актуализирате. MySQL не харесва това и въпреки че има начини да се заобиколи ограничението, това прави нещата малко объркващи...

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

(Аз мисля това ще работи)


ЗАБЕЛЕЖКА:

И двете предполагат, че И ДВАТА @old_pos и @new_pos, или @id и @new_pos са намерени, то не проверява и ще направи бъркотия, ако не съществуват.

Това може да се реши, като се постави в транзакция и се върне назад, ако ROW_COUNT() показва, че само 1 запис е актуализиран.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите данни за последния 1 час в MySQL

  2. mysqldump не работи в crontab

  3. mysql подзаявка в LEFT JOIN

  4. MySQL програма mysql_tzinfo_to_sql

  5. Библиотеката за грешки на пътника не е заредена