UPDATE userTable
SET userAge=245, userName="fred" WHERE userId = 321,
SET userAge=32, userName="dave" WHERE userId = 424;
このコードを記述するより良い方法はありますか?
はい、case
ステートメントを使用して:
UPDATE userTable
SET userAge= (case when userId = 321 then 245 else 32 end),
userName= (case when userId = 321 then 'fred' else 'dave' end)
WHERE userId in (321, 424);
join
ただし、これを記述するより一般的な方法は、構文を使用することだと思います。
UPDATE userTable join
(select 321 as UserId, 'fred' as userName, 245 as userAge union all
select 424, 'dave', 32
) toupdate
on userTable.userId = toupdate.UserId
set userTable.userAge = toupdate.userAge,
userTable.userName = toupdate.userName;
これにより、行を追加しやすくなり、join
withを使用することの威力が示されupdate
ます。
編集:
性能について。2 つの更新では、データベースに 2 つのトランザクションを設定する必要があります。1 回の更新で必要なのは 1 つだけです。そのため、1 回の更新で少し速くなる可能性があります。にインデックスがない場合にのみ、パフォーマンスの違いが顕著になりますuserTable(userId)
。このようなインデックスを使用すると、両方のバージョン (where
句を使用する場合と使用する場合join
) で、インデックスを使用して更新する行をすばやく見つける必要があります。
しかし、もっと重要な違いがあります。2 つの更新により、テーブルは更新の「間」で一貫性のない状態になります。ユーザー ID と名前は、これらの更新間で一貫していません。2 番目のテーブルが失敗するか、誰かがテーブルを使用すると、データの一貫性が失われます。2 つの更新を同時に行いたいとします (明示的なトランザクションを使用してこれを修正することもできますが、わざわざする必要はありません)。
UPDATE userTable
SET userAge = case when userId = 321 then 245
when userId = 424 then 32
end,
userName = case when userId = 321 then "fred"
when userId = 424 then "dave"
end
WHERE userId in (321, 424)
それを行う1つの方法は
UPDATE userTable
SET userAge=(case when userId=321 then 245 else 424 end),
userName=(case when userId=321 then 'fred' else 'dave' end)
WHERE userId in (321,, 424)
ただし、2 つのクエリで実行しても問題ありません。
代わりに STATMENTS を使用してください。
UPDATE userTable
SET userAge = case when userId = 321 then 245
when userId = 424 then 32 end,
userName = case when userId = 321 then "fred"
when userId = 424 then "dave" end
WHERE userId in (321, 424)