19

2 つのデータセット間で主キーの値を交換することは可能ですか? もしそうなら、どのようにそれを行うでしょうか?

4

3 に答える 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 に答える