2 つのデータセット間で主キーの値を交換することは可能ですか? もしそうなら、どのようにそれを行うでしょうか?
13375 次
3 に答える
12
簡単にするために、2 つのレコードがあると仮定しましょう
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の値に設定する」と解釈できます。ただし、一部のデータベースは適切な分離を行わない場合があります。たとえば、この質問を参照してください (ただし、上記のクエリを実行すると、おそらく複数テーブルの更新と見なされ、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 に答える