Mysql:交换不同行的数据

Ala*_*rte 15 mysql sql

假设一个fruits看起来像这样的表:

------------------------------------------
| id |    name    |   color   | calories |
------------------------------------------
| 1  | apple      | red       | 20       |
| 2  | orange     | orange    | 10       |
| 3  | grapes     | green     | 5        |
| 4  | bananas    | yellow    | 15       |
| 5  | plum       | purple    | 25       |
------------------------------------------
Run Code Online (Sandbox Code Playgroud)

如何将行的值与另一行交换,使id号保持不变?

例:

SWAP ROW WITH ID "5" WITH ROW WITH ID "2"
Run Code Online (Sandbox Code Playgroud)

结果:

------------------------------------------
| id |    name    |   color   | calories |
------------------------------------------
| 1  | apple      | red       | 20       |
| 2  | plum       | purple    | 25       |
| 3  | grapes     | green     | 5        |
| 4  | bananas    | yellow    | 15       |
| 5  | orange     | orange    | 10       |
------------------------------------------
Run Code Online (Sandbox Code Playgroud)

请注意,除了id之外,所有值都是完整的.我需要使用一个非常大的值列表来执行此操作,因此我需要一个单行或最多不需要创建临时表的东西,以及类似的东西.

注意:id是唯一的

谢谢

coc*_*lla 13

您可以使用连接不等式来排列要交换的行:

update fruit a
 inner join fruit b on a.id <> b.id
   set a.color = b.color,
       a.name = b.name,
       a.calories = b.calories
 where a.id in (2,5) and b.id in (2,5)
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!18/27318a/5


fth*_*lla 5

由于ID是唯一的,因此仅交换ID就很困难,而交换列内容也更容易。这样的查询可能是您需要的:

UPDATE
  yourtable t1 INNER JOIN yourtable t2
  ON (t1.id, t2.id) IN ((1,5),(5,1))
SET
  t1.color = t2.color,
  t1.name = t2.name,
  t1.calories = t2.calories
Run Code Online (Sandbox Code Playgroud)

请看这里的小提琴。