假设表格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 |
------------------------------------------
我如何交换行的值与另一行,保留ID号完好无损?
示例:
SWAP ROW WITH ID "5" WITH ROW WITH ID "2"
结果:
------------------------------------------
| id | name | color | calories |
------------------------------------------
| 1 | apple | red | 20 |
| 2 | plum | purple | 25 |
| 3 | grapes | green | 5 |
| 4 | bananas | yellow | 15 |
| 5 | orange | orange | 10 |
------------------------------------------
请注意,除了id之外,所有值都是完整的。 我需要使用一个非常大的值列表来执行此操作,因此我需要一个单行或最多不需要创建临时表的东西,以及类似的东西。
注意:id是唯一的
谢谢
答案 0 :(得分:10)
您可以使用连接不等式来排列要交换的行:
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)
答案 1 :(得分:4)
由于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
请参阅小提琴here。
答案 2 :(得分:0)
这是一种临时存储值而不使用水果表中的临时表或虚拟行的方法:
SELECT name, color, calories FROM fruit WHERE id = 2 INTO @name, @color, @calories;
UPDATE fruit AS f1, fruit AS f2
SET
f1.name = f2.name, f2.name = @name,
f1.color = f2.color, f2.color = @color,
f1.calories = f2.calories, f2.calories = @calories
WHERE (f1.id, f2.id) = (2, 5);
这是另一个使用虚拟id值的解决方案:
UPDATE fruit SET id = 0 WHERE id = 5;
UPDATE fruit SET id = 5 WHERE id = 2;
UPDATE fruit SET id = 2 WHERE id = 0;
答案 3 :(得分:0)
如果您的操作基于 ID ,并且您想要交换整行,那么交换 UNIQUE ID 的奇特方式是开始将它们编号为1,并使用0作为临时值。
执行此操作的另一种方法是使用无符号列,并使用指定值(即:-1)作为临时值。我不会真的推荐后者,因为我们使用这种方法实际上浪费空间。有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html。