Unr*_*son 12
为简单起见,假设您有两条记录
id name
---------
1 john
id name
---------
2 jim
Run Code Online (Sandbox Code Playgroud)
来自表t(但它们可以来自不同的表)
你可以做到
UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2
Run Code Online (Sandbox Code Playgroud)
注意:更新主键有其他副作用,可能首选的方法是保留主键,并交换所有其他列的值.
警告:之所以这样t.id = t2.id, t2.id = t.id做是因为在SQL中,更新发生在事务级别上.的t.id不变量,=不分配.您可以将其解释为"将t.id设置为查询效果之前的值t2.id,将t2.id设置为查询效果之前的值t.id".但是,某些数据库可能没有进行适当的隔离,例如请参阅此问题(但是,运行上面的查询,可能被认为是多表更新,根据mysql中的标准运行).
我更喜欢以下方法(Justin Cave在某处写得类似):
update MY_TABLE t1
set t1.MY_KEY = (case when t1.MY_KEY = 100 then 101 else 100 end)
where t1.MYKEY in (100, 101)
Run Code Online (Sandbox Code Playgroud)