![]() |
1
167
我只需要处理同样的问题,我会总结我的发现。
从本质上讲,第一个表是正在更新的表,第二个表用于从中提取旧数据。
这是我的测试模式:
|
![]() |
2
38
你可以取和,用x和y减去相反的值。
这是一个样本测试(它适用于负数)
这是正在执行的交换
试一试!!!! |
![]() |
3
19
以下代码适用于我的快速测试中的所有场景:
|
![]() |
4
10
更新表格集x=y,y=x 会做你想要的(编辑:在PostgreSQL,而不是MySQL中,见下文)。这些值从旧行中获取并分配给同一行的新副本,然后替换旧行。您不必使用临时表、临时列或其他交换技巧。 @我明白了。这是令人震惊和意想不到的。我使用了PostgreSQL,我的答案在那里工作正常(我试过了)。见 PostgreSQL UPDATE docs (在参数、表达式下),其中提到set子句右侧的表达式显式使用列的旧值。我看到了相应的 MySQL UPDATE docs 包含语句“单表更新分配通常从左到右进行评估”,这意味着您描述的行为。 很高兴知道。 |
![]() |
5
5
好吧,为了好玩,你可以这样做!(假设要交换字符串值)
在MySQL中滥用从左到右的评估过程是很有趣的。 或者,如果它们是数字,就使用XOR。你提到坐标,那么你有可爱的整数值,还是复杂的字符串? 编辑:XOR的工作原理如下:
|
![]() |
6
4
两个备选方案 1。使用临时表 2。调查 这个 XOR algorithm |
![]() |
7
4
像这样?
编辑:关于格雷格的评论: 不,这不管用:
mysql>更新测试集x=y,y=x; 查询正常,2行受影响(0.00秒) 匹配的行:2已更改:2个警告:0 mysql>从测试中选择* +----+----+ x y y +----+----+ (2×2) (4×4) +----+----+ 一组2行(0.00秒) |
![]() |
8
4
我认为,采用中间交换变量是最佳做法:
首先,它总是工作的;其次,不管数据类型如何,它都工作。 尽管两者兼而有之
和
一般都是工作的,只对数字数据类型有一种方式,而且它是您的责任,防止溢出,您不能在有符号和无符号之间使用异或,您也不能用和来表示溢出的可能性。 和
不工作 如果c1是0或空或零长度字符串或只是空格。 我们需要把它换成
以下是脚本:
|
![]() |
9
2
这当然行!我只是需要它来交换欧元和skk价格栏。:)
上述操作将不起作用(错误1064(42000):您的SQL语法中有错误) |
![]() |
10
1
假设列中有带符号整数,则可能需要使用cast(a^b表示带符号),因为^运算符的结果在MySQL中是一个无符号64位整数。 如果它对任何人都有帮助,下面是我在两行之间交换同一列的方法:
其中$1和$2是两行的键,$3是第一个查询的结果。 |
![]() |
11
1
我没试过,但是
可能会这样。 作记号 |
![]() |
12
1
你 能够 更改列名,但这更像是一种黑客行为。但是要小心这些列上的任何索引 |
![]() |
13
0
使用单个查询交换列值 更新我的表格集a=@tmp:=a,a=b,b=@tmp; 干杯。。。! |
![]() |
14
0
我只需要将值从一列移动到另一列(如归档),然后重置原始列的值。
|
![]() |
15
0
|
![]() |
16
0
此示例交换 启动日期 和 末日 对于日期循环错误的记录(在将ETL执行到主要重写时,我发现了一些 开始 日期晚于 结束 日期。向下,糟糕的程序员!). 在现场,出于性能原因(比如朱利安·戴斯,但是有1900-01-01的0根),我使用的是医用材料,所以我可以在 其中mdu.start_date>mdu.end_date . pks分别位于所有3列上(出于操作/索引原因)。
|
![]() |
17
0
表名是客户。 字段是A和B,将值交换为B;。 更新客户设置a=(@temp:=a),a=b,b=@temp 我检查过这个工作正常。 |
![]() |
hello_programmers · Mysql从其他表输出一列 2 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 2 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 2 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 2 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 2 年前 |
|
Kugelfisch · 用php为数据库加密数据 2 年前 |