0

私の MySQL データベースには unsigned mediumint 列があり、その値を増減させ続けています。

ただし、値が 0 のときに減少しないようにしたいのです。そうすると、UPDATE によって値が mediumint の最大値 16777215 になるようになります。

したがって、減分するときに次のクエリがあります。

UPDATE `counters` SET `received`=IF(CAST(`received`-1 AS SIGNED)>0, `received`-1, 0) WHERE `id`="1234"

これは、たった 1 つのクエリで作業するための唯一のトリックでした。

MySQL 5.1 では非常にうまく機能しますが、昨日 MySQL 5.5 にアップグレードしたところ、次のエラーが発生しました。

BIGINT UNSIGNED value is out of range in '(`db_main`.`counters`.`received` - 1)'

これを修正する方法はありますか?
または... 1つだけのクエリで、1から0を引くときに「16777215」の値を取らないことを確認する他の方法はありますか?

編集- 「 AND 受信 > 0」を追加して、WHERE を使用できます。問題は、2 つの列を同時に更新したい場合があり、WHERE 句にすべての列 > 0 を入れると、どの列も更新されないということです。

ありがとうございました。

4

1 に答える 1

1

それは少し...面倒に思えますが、キャストと条件付きのものがあります(余談ですが、行ごとの関数は大きなテーブルでうまくスケーリングすることはめったにありません)。

whereすでにゼロになっている場合は、減分を停止するように句を変更してみませんか?

update counters set received = received - 1
    where id = '1234' and received > 0

の値に関係なく更新したい他の列がある場合はreceived、トランザクションでそれを行うことができます。

begin transaction
update counters set received = received - 1 where id = '1234' and received > 0
update counters set xyzzy = 'plugh' where id = '1234'
commit transaction

これは減少receivedしますが、ゼロ未満ではなく、xyzzy何があっても変化します。そして、多くのクエリをダウンさせる行ごとのものから離れています。

于 2012-04-07T02:00:35.817 に答える