-
叮当猫咪
你不能只是交换价值。您需要临时变量第一种方式: UPDATE table_name SET column1=column2, column2=@temp WHERE (@temp:=column1) > column2;第二种方式:这种方式更好,因为它检查任何值是否为 NULLUPDATE table_name SET column1=(@temp:=column1), column1= column2, column2 = @temp WHERE column1 > column2;第二种方式很简单。它比较两个列并在需要时交换这个列。
-
慕标琳琳
在UPDATE语句中,MySql 在使用更新列的值时使用非标准 SQL 行为,因为在这样的语句中:SET a = x, b = aa赋值中的值b = a不会是表中存储的原始值,而是a赋值后的值a = x。所以这:update tablenameset column1 = column2, column2 = column1在其他数据库中可以使用的方法在 MySql 中不起作用。有一个不使用变量或不必要的连接的解决方法:update tablenameset column1 = column1 + column2, column2 = column1 - column2, column1 = column1 - column2where column1 > column2;从以下开始工作:单表 UPDATE 分配通常从左到右评估。结果:| id | column1 | column2 || --- | ------- | ------- || 1 | 3 | 50 || 2 | 4 | 51 |
-
慕斯王
您在表上有一个主键,所以一个简单的选择是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+ 中不推荐使用这种变量它不依赖于表达式的顺序,因此更健壮并且更容易适应更复杂的表达式。