sql swap主键值

Tho*_*mas 17 sql swap primary-key

是否可以在两个数据集之间交换主键值?如果是这样,那会怎么做?

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中的标准运行).

  • 您的解决方案在MySQL 5.5.22-log中不起作用:`1706 - 不允许更新主键/分区键,因为表更新为'lae_marketing_invoice_history'和't2'. (4认同)

Bar*_*icz 6

我更喜欢以下方法(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)