是否可以在两个数据集之间交换主键值?如果是这样,人们将如何做到这一点?
问问题
13375 次
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 回答