我想交换表中两列的值,我发现在 SQL 中我们可以使用 Update 来做到这一点:
update the_table set first_name = last_name, last_name = first_name;
它有效但我想知道 SQL 如何在不覆盖其他列的列中的数据的情况下做到这一点?
我想交换表中两列的值,我发现在 SQL 中我们可以使用 Update 来做到这一点:
update the_table set first_name = last_name, last_name = first_name;
它有效但我想知道 SQL 如何在不覆盖其他列的列中的数据的情况下做到这一点?
@mustaccio 已经回答了这是如何在物理上实现的。
逻辑规范如下:
语句右侧的列
=
必须来自应用更新之前的值。因此交换值很简单,因为右侧总是指旧值。UPDATE SET
另一种了解原因的方法是考虑等效地重写您的语句:
这不是所有 SQL 产品都实现的,但根据 SQL 标准它是等效的,并且在实现它的地方,它与你的完全一样。
至于是否保证:是的。它是由 SQL 规范强制执行的,据我所知,大多数 DBMS 都实现了这个要求(MySQL 和派生/分叉的产品,例如 MariaDB 是一个例外,在这种情况下没有正确实现标准)。
这是因为每一行都是整体处理的,而不是逐列处理。简化的顺序如下:
SQL 标准(至少是我可以访问的版本)规定了这些术语中的行为(强调我的):