You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DECIMAL(8,2)列转为INTEGER并保留精度(同列名)

解决方案:保留原列名将DECIMAL(8,2)转为INTEGER并保留精度

针对你的需求,完全可以在保留原列名的前提下完成操作。核心思路是先将DECIMAL(8,2)的数据乘以100转为整数,再修改列类型。以下是通用且安全的操作步骤,适用于50万+数据量的大表:

方法一:临时列过渡法(通用所有关系型数据库)

这种方法风险最低,适合大表操作,避免长时间锁表影响业务:

  1. 添加临时整数列
ALTER TABLE your_table ADD COLUMN temp_col INTEGER;
  1. 将原列数据转换为整数写入临时列
UPDATE your_table SET temp_col = CAST(original_col * 100 AS INTEGER);

注:DECIMAL(8,2)最大值为999999.99,乘以100后为99999999,远小于32位INTEGER的上限(2147483647),不会出现溢出问题。

  1. 验证数据转换正确性
SELECT original_col, temp_col FROM your_table LIMIT 20;

确认124.45对应12445、20.00对应2000等转换结果符合预期。
4. 删除原列

ALTER TABLE your_table DROP COLUMN original_col;
  1. 将临时列重命名为原列名
ALTER TABLE your_table RENAME COLUMN temp_col TO original_col;

方法二:直接修改(适用于MySQL 8.0+等支持在线DDL的数据库)

如果你的数据库支持在ALTER TABLE中同时处理数据转换和类型修改,可以简化操作,但需注意大表锁表风险:

-- 先修改列类型为INTEGER(此时数据会被截断为整数,比如124.45变成124)
ALTER TABLE your_table MODIFY COLUMN original_col INTEGER;
-- 再将数据乘以100恢复精度
UPDATE your_table SET original_col = original_col * 100;

或者使用MySQL的合并语法减少锁表时间:

ALTER TABLE your_table 
MODIFY COLUMN original_col INTEGER,
UPDATE original_col = original_col * 100;

关键注意事项

  • 操作前必须备份数据:50万+数据的表,备份后再执行操作,避免意外丢失数据。
  • 低峰期操作:生产环境尽量在业务低峰执行,减少对用户的影响。
  • 全量验证:修改完成后,随机抽查多组数据,确保转换无误差。

内容的提问来源于stack exchange,提问作者Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:23:30