Просто совет, который не подходит в качестве комментария. Я просто пытался вычесть 32000 из 32047 (не отрицательный результат) и получал ошибки. Также сбивало с толку, я получал ошибки BIGINT, но мое вычитание было в столбце SMALLINT! (Что все еще не имеет смысла.)
Если вы получаете ошибки «вне диапазона», даже если ваш «баланс» положительный, попробуйте добавить «предел 1» в конец вашего запроса. Может быть, это ошибка в MySQL?
mysql> update posts set cat_id=cat_id-32000 where timestamp=1360870280;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`xxxxx`.`posts`.`cat_id` - 32000)'
mysql> update posts set cat_id=cat_id-32000 where timestamp=1360870280 limit 1;
Query OK, 1 row affected (6.45 sec)
Rows matched: 1 Changed: 1 Warnings: 0
В моем случае отметка времени уникальна (я только что проверил, чтобы убедиться), но не была явно определена как уникальная при создании таблицы. Так почему же здесь необходим «предел 1»? Но кого это волнует, это работает!