MySQL:価格更新の問題

1215 ワード

この問題は簡単で、Joe Celkoの「SQLプログラミングスタイル」から来て、少し修正します:いくつかの本に対して価格を更新して、30¥の10%を下回らないで、30¥の5%を下回らないでください.
まず表を作成します.
CREATE TABLE `books` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `price` float NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

次のデータを挿入します.
+----+-------+
| id | price |
+----+-------+
|  1 |    30 |
|  2 |    10 |
+----+-------+

メソッド1:カーソルの使用
カーソルを使用するには、ループを使用する必要があります.カーソルの使用は一般的に推奨されません.
UPDATEを2つ使用
UPDATE books
    SET price = price * 0.90
    WHERE price>=30;

UPDATE books
    SET price = price * 0.95
    WHERE price<30;

実行後、データは次のとおりです.
+----+-------+
| id | price |
+----+-------+
|  1 | 25.65 |
|  2 |   9.5 |
+----+-------+

30¥は更新後27¥になるはずですが、2番目のupdateで27¥を更新したので、結果は私たちが望んでいるものではありません.
UPDATE+CASEを1つ使用
UPDATE books
    SET price = CASE WHEN price >= 30
                        THEN price * 0.90
                        ELSE price * 0.95 END;

実行後、データは次のとおりです.
+----+-------+
| id | price |
+----+-------+
|  1 |    27 |
|  2 |   9.5 |
+----+-------+

結果は要求に合致した.