3 回答
TA贡献1776条经验 获得超12个赞
你不能只是交换价值。您需要临时变量第一种方式:
UPDATE table_name SET column1=column2, column2=@temp WHERE (@temp:=column1) > column2;
第二种方式:这种方式更好,因为它检查任何值是否为 NULL
UPDATE table_name SET column1=(@temp:=column1), column1= column2, column2 = @temp WHERE column1 > column2;
第二种方式很简单。它比较两个列并在需要时交换这个列。
TA贡献1830条经验 获得超9个赞
在UPDATE语句中,MySql 在使用更新列的值时使用非标准 SQL 行为,因为在这样的语句中:
SET a = x, b = a
a赋值中的值b = a不会是表中存储的原始值,而是a赋值后的值a = x。
所以这:
update tablename
set column1 = column2,
column2 = column1
在其他数据库中可以使用的方法在 MySql 中不起作用。
有一个不使用变量或不必要的连接的解决方法:
update tablename
set column1 = column1 + column2,
column2 = column1 - column2,
column1 = column1 - column2
where column1 > column2;
从以下开始工作:
单表 UPDATE 分配通常从左到右评估。
结果:
| id | column1 | column2 |
| --- | ------- | ------- |
| 1 | 3 | 50 |
| 2 | 4 | 51 |
TA贡献1864条经验 获得超2个赞
您在表上有一个主键,所以一个简单的选择是join:
update t join
t t2
on t.id = t2.id
set t.x = t2.y,
t.y = t2.x
where t.x > t.y;
这是一个 db<>fiddle。
出于以下几个原因,我更喜欢这种方法而不是使用变量:
这不取决于子句的评估顺序set,我认为 MySQL 不能保证这一点。
我认为在 MySQL 8+ 中不推荐使用这种变量
它不依赖于表达式的顺序,因此更健壮并且更容易适应更复杂的表达式。
- 3 回答
- 0 关注
- 126 浏览
添加回答
举报