web-dev-qa-db-ja.com

MySQL:条件が満たされた場合にのみフィールドを更新します

特定の条件が満たされた場合にのみフィールド値を更新するMySQLでUPDATEクエリを実行することは可能ですか?このようなもの:

UPDATE test
SET
    CASE
        WHEN true
        THEN field = 1
    END
WHERE id = 123

言い換えると:

UPDATE test
SET
    something = 1,        /*field that always gets updated*/
    CASE
        WHEN true
        THEN field = 1    /*field that should only get updated when condition is met*/
    END
WHERE id = 123

これを行う適切な方法は何ですか?

55
Caballero

はい!

ここに別の例があります:

UPDATE prices
SET final_price= CASE
   WHEN currency=1 THEN 0.81*final_price
   ELSE final_price
END

これは、MySQLが行を更新しないために機能します。変更がない場合、 ドキュメントで説明されているように

現在の値に列を設定すると、MySQLはこれを認識し、更新しません。

109
fedorqui

私の意見では、読みやすい別の解決策は次のとおりです。

UPDATE test SET something = 1, field = IF(condition is true, 1, field) WHERE id = 123

これは、条件が満たされた場合は「フィールド」を1に設定し(例として使用されるOPのように)、満たされない場合は「フィールド」の現在の値を使用します。前の値を使用することは、変更しないことと同じなので、そこに行きます。

17
Dominique

これを試して:

UPDATE test
SET
   field = 1
WHERE id = 123 and condition
15
Hamlet Hakobyan

MySQL IF()条件関数を使用できる別のソリューション:

UPDATE test
SET  field  = IF(something == 1{CONDITION}, 1 {NEW VALUE}, field)
WHERE `id` = 5
2
krishna

別のバリエーション:

UPDATE test
SET field = IF ( {condition}, {new value}, field )
WHERE id = 123

{new value}が満たされた場合にのみ、field{condition}で更新します

1
phoenix

aND条件のソリューションが見つかりました:$trainstrength = "UPDATE user_character SET strength_trains = strength_trains + 1, trained_strength = trained_strength +1, character_gold = character_gold - $gold_to_next_strength WHERE ID = $currentUser AND character_gold > $gold_to_next_strength";

0
Oldhuntersblood