読者です 読者をやめる 読者になる 読者になる

MariaDBの case when の条件判定式で unsigned int のカラムに対して負数になるような判定式を書いたらエラーになる

MariaDB

unsigned int のカラムに対して
減算処理をするときに結果が負数になってしまうとエラーになる。

以下の様な感じ。

MariaDB [un]> select * from tb;
+------+
| hp   |
+------+
|  100 |
+------+

MariaDB [un]> update tb set hp = hp - 1000;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`un`.`tb`.`hp` - 1000)'

これは unsigned だから当然。

でも、以下もエラーになる。
これは hp から 1000 を減算して、負になるようであれば0にするという処理。
case when の演算でもカラムが負数になるとエラーになるのか。

MariaDB [un]> update tb set hp = case when hp - 1000 < 0 then 0 else hp - 1000 end;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`un`.`tb`.`hp` - 1000)'

解決方法としては演算方法を変えればいい。

hp - 1000 < 0

hp < 1000

これによって結果が負数になることがなくなったので、
エラーが発生せずに hp を 0 に設定できる。