6
UPDATE userTable 
SET userAge=245, userName="fred"  WHERE userId = 321, 
SET userAge=32, userName="dave" WHERE userId = 424;

このコードを記述するより良い方法はありますか?

4

5 に答える 5

8

はい、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;

これにより、行を追加しやすくなり、joinwithを使用することの威力が示されupdateます。

編集:

性能について。2 つの更新では、データベースに 2 つのトランザクションを設定する必要があります。1 回の更新で必要なのは 1 つだけです。そのため、1 回の更新で少し速くなる可能性があります。にインデックスがない場合にのみ、パフォーマンスの違いが顕著になりますuserTable(userId)。このようなインデックスを使用すると、両方のバージョン (where句を使用する場合と使用する場合join) で、インデックスを使用して更新する行をすばやく見つける必要があります。

しかし、もっと重要な違いがあります。2 つの更新により、テーブルは更新の「間」で一貫性のない状態になります。ユーザー ID と名前は、これらの更新間で一貫していません。2 番目のテーブルが失敗するか、誰かがテーブルを使用すると、データの一貫性が失われます。2 つの更新を同時に行いたいとします (明示的なトランザクションを使用してこれを修正することもできますが、わざわざする必要はありません)。

于 2013-08-06T13:53:55.327 に答える
5
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) 
于 2013-08-06T13:53:35.860 に答える
2

それを行う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 つのクエリで実行しても問題ありません。

于 2013-08-06T13:54:01.237 に答える
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) 
于 2013-08-06T13:54:16.083 に答える