Переполнение поля численного типа

DeadMorozBLR

Новичок
Переполнение поля численного типа

Есть поле, содержащее сумму на счете пользователя, к примеру, DECIMAL(6,2). Добавление суммы на счет выполняется запросом вида "UPDATE `table` SET `field` = `field` + $amount". В случае, если на счету было, к примеру, 5'000.00 и нужно добавить еще 6'000.00, поле переполнится, и будет содержать значение 9'999.99 вместо 11'000.00, при этом выполнение запроса не вызывает ни ошибке, ни предупреждения. Хотя с т.з. безнес-логики приложения ошибка есть (теряется сумма на счете).

В голову приходит только явно определять максимально возможное значение поля, вычислять новое значение на стороне приложения, и если оно не превышает максимально допустимого, выполнять запрос на обновление.

Решение кажется кривоватым, т.к.
- целостность данных обеспечивается не за счет СУБД, а за счет приложения — при изменении макс. допустимого значения изменения придется вносить и в БД, и в конфигурацию приложения (ну или сделать так, чтобы приложение автоматически определяло это значение через дополнительный запрос);
- логика обновления значения (`field` = `field` + $amount) дублируется в проверке допустимости действия (получить новое значение, чтобы проверить, не переполнится ли поле, и непосредственно обновить значения поля) —_изменения в логике придется описывать в двух местах.

Может быть есть более грамотные решения?
 

asterisk

Новичок
2 варианта:
1. расширить тип данных в БД
2. не прибавлять к первоначальному платежу последующие, а хранить списком историю платежей.
 

DeadMorozBLR

Новичок
1. Да, но хотелось бы получить более общее решение, не только для этого случая.
2. Тоже не выход. Тут такая же проблема —_надо руками выставлять макс. допустимую сумму платежа, чтобы она в соответствующее поле могла целиком записаться.
 

asterisk

Новичок
выставь максимально возможный тип данных, в каждой конкретной задаче есть потолок который ну никак не может быть превышен.
 
Сверху