我有一个用例,我在MySQL
中有一个列,其中包含12.458
等数字。
我需要获取这些数字的列表,并且需要在数据库中更新它们以便将它们四舍五入到小数点后两位,我意识到它仍然会在数据库中存储3个小数位,但我的意思是这样的我给出的示例四舍五入为12.460
。
我知道我可以通过MySQL轻松完成这项工作,然后通过以下查询获取数据没有问题;但是,如果数据在四舍五入的时间内以及实际选择它的时间内更新,我不想这样做。
所以我认为如果只是选择它然后用PHP进行四舍五入......
$amount = round($amount, 2);
...是的,自从我选择数据后,数据现在可能再次在数据库中发生了变化;但这不是重要的部分 - 重要的部分是对数据库中的金额运行-
或+
操作。
所以我想要做的就是获得该轮的剩余结果,然后在mysql字段上运行一个操作..
因此...
12.457 = 12.46 = +0.003 to field
12.421 = 12.42 = -0.001 to field
不幸的是,该表不是InnoDB,我无法将其锁定更新。
有没有更好的方法来做我想要的?
修改:您可以同时执行SELECT
和UPDATE
,以便从选择中获取更新数据吗?
答案 0 :(得分:0)
CREATE TABLE YourTable
(`ExistingValue` decimal(12,3), `ExtraValue` decimal(12,3))
;
INSERT INTO YourTable
(`ExistingValue`, `ExtraValue`)
VALUES
(12.458, null)
;
update YourTable
set
ExtraValue = ExistingValue - Round(ExistingValue,2)
, ExistingValue = Round(ExistingValue,2)
;
select
*
from YourTable
| EXISTINGVALUE | EXTRAVALUE |
|---------------|------------|
| 12.46 | -0.002 |
答案 1 :(得分:0)
如果您主要关心的是看到过时的值,那么您可以使用transaction:
START TRANSACTION;
UPDATE yourTable SET yourField = round(yourField, 2);
SELECT * FROM yourTable;
COMMIT;
即使其他进程更新了表格,您也会看到一致的结果。这依赖于InnoDB。