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 に設定できる。