我使用mysql在Laravel中为我的办公室构建了一个管理系统,其中一个主要表格是产品价格的两倍。该系统已经投入生产2年多了,但是这里的政府更改了我们的货币并删除了5个零,因此我需要更改所有价格值,同时保留一些小数。
当前,列表中的最低价格是500 而最高的是14985010
我需要执行查询以更改生产数据库上该列中的所有价格值(已完成备份,所以应该没问题)
因此500个应为:0.005 而14985010应该是:149.8501
我认为所需要做的就是将值除以100000,但我可能是错的。
我的SQL技能非常生锈,我已经搜索了一段时间,但找不到正确的答案。任何指针将不胜感激。谢谢!
答案 0 :(得分:1)
我实际上建议不要将您的所有货币数据除以某个较大的因素,例如100K。相反,我建议在您的价格表中添加一个新列,这是另一个表中的关键,给出了应用于确定当前价格的因素。所以您可能会有这样的设置:
prices table
price | factorKey
500 | 2
14985010 | 2
factors table
factorKey | value
1 | 1
2 | 0.00001
然后,要生成实际的当前价格,您可以进行加入:
SELECT
p.price * f.value AS price
FROM prices p
INNER JOIN factors f
ON p.factorKey = f.factorKey;
在此方案下,您只需修改要与价格数据一起使用的当前系数。您甚至可以维护另一个表来跟踪历史价格。建议这样做的原因之一是,也许您的政府将来会再次改变价格。在原始数据上进行如此大的手动除法/乘法操作很容易出错。
答案 1 :(得分:0)
首先,您的货币数据类型应支持十进制数字,而不仅仅是整数。我建议您在专栏中使用DECIMAL(12,4)
。
确定列数据类型可以保留十进制数字后,就可以更新表中的所有行。
这是一个示范:
mysql> create table MyTable ( MyCurrencyColumn decimal(12,4));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into MyTable values (500), (14985010);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from MyTable;
+------------------+
| MyCurrencyColumn |
+------------------+
| 500.0000 |
| 14985010.0000 |
+------------------+
2 rows in set (0.00 sec)
mysql> UPDATE MyTable SET MyCurrencyColumn = MyCurrencyColumn / 100000;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> select * from MyTable;
+------------------+
| MyCurrencyColumn |
+------------------+
| 0.0050 |
| 149.8501 |
+------------------+
答案 2 :(得分:0)
您应该首先修复该列,以确保它可以处理适当的小数位。我建议像这样:
alter table t modify column price decimal(38, 10);
然后只需更新值:
update t
price = price / 100000;
话虽如此,您可能要检查这些值是否与您期望的值完全一样:
select cast(cast(price as decimal(38, 10)) / 100000 as decimal(38, 10))
可能有一些您不喜欢的细微舍入错误。