我试图更正一个存储两年的表格中的一些数据:
id | start_year | end_year
---|------------|---------
1 | 2001 | 2003
2 | 2008 | 2005
3 | 2004 | 2010
4 | 2012 | NULL
5 | 2003 | 2004就像在第二排,岁月是不对的。如何在start_year > end_year行上交换这些列的值
注意:不应该交换行4,其中end_year为NULL。这应该保持不变。
发布于 2015-03-06 11:33:51
一点点数学魔法可以帮上忙:
UPDATE myTable
SET start_year = start_year - end_year,
end_year = end_year + start_year,
start_year = end_year - start_year
WHERE start_year > end_year
AND end_year IS NOT NULL备注
我不知道这种更新方法有多可靠。为了达到预期效果,必须计算表达式,并且必须按照查询中显示的顺序执行赋值。如果MySQL决定以不同的顺序计算或分配它们,那么查询将在表中产生混乱。
摘录自手册
单表更新分配通常从左到右进行评估。对于多个表更新,无法保证任务按任何特定顺序执行.
从上面的片段来看,是否从左到右对赋值进行评估并不十分清楚。它说的“一般”,但它没有解释什么是例外。
我使用问题中提供的小样本数据对MySQL 5.5.24上的查询进行了测试,它如预期的那样工作。
建议
在运行此查询之前备份您的表。你已经被警告了!
发布于 2015-03-06 11:07:33
警告,下面的一般/ANSI SQL答案将而不是用于MySQL:
update tablename
set start_year = end_year,
end_year = start_year
where start_year > end_yearhttps://stackoverflow.com/questions/28897482
复制相似问题