19

是否可以在两个数据集之间交换主键值?如果是这样,人们将如何做到这一点?

4

3 回答 3

12

为简单起见,假设您有两条记录

id   name
---------
1    john

id   name
---------
2    jim

都来自表 t(但它们可以来自不同的表)

你可以做

UPDATE t, t as t2
SET t.id = t2.id, t2.id = t.id
WHERE t.id = 1 AND t2.id = 2

注意:更新主键有其他副作用,可能首选的方法是保留主键并交换所有其他列的值。

警告:工作的原因t.id = t2.id, t2.id = t.id是因为在 SQL 中更新发生在事务级别。t.id不是变量,也不=是赋值。您可以将其解释为“将 t.id 设置为 t2.id 在查询生效之前的值,将 t2.id 设置为 t.id 在查询生效之前的值”。但是,某些数据库可能无法进行适当的隔离,例如参见this question(但是,运行上面的查询,这可能被认为是多表更新,按照mysql中的标准运行)。

于 2010-05-11T12:51:37.313 回答
8

我更喜欢以下方法(贾斯汀洞穴在某处写过类似的):

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)
于 2014-10-27T09:35:15.490 回答
1

类似于@Bart 的解决方案,但我使用了稍微不同的方式:

update t
set t.id=(select decode(t.id, 100, 101, 101, 100) from dual)
where t.id in (100, 101);

这完全一样,但我知道decode得更好case

此外,为了使@Bart 的解决方案对我有用,我必须添加一个when

update t
set t.id = (case when t.id = 100 then 101 else 101 end)
where t.id in (100, 101);
于 2015-11-18T09:11:46.507 回答