如何将DECIMAL(8,2)列转为INTEGER并保留精度(同列名)
解决方案:保留原列名将DECIMAL(8,2)转为INTEGER并保留精度
针对你的需求,完全可以在保留原列名的前提下完成操作。核心思路是先将DECIMAL(8,2)的数据乘以100转为整数,再修改列类型。以下是通用且安全的操作步骤,适用于50万+数据量的大表:
方法一:临时列过渡法(通用所有关系型数据库)
这种方法风险最低,适合大表操作,避免长时间锁表影响业务:
- 添加临时整数列
ALTER TABLE your_table ADD COLUMN temp_col INTEGER;
- 将原列数据转换为整数写入临时列
UPDATE your_table SET temp_col = CAST(original_col * 100 AS INTEGER);
注:DECIMAL(8,2)最大值为999999.99,乘以100后为99999999,远小于32位INTEGER的上限(2147483647),不会出现溢出问题。
- 验证数据转换正确性
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;
- 将临时列重命名为原列名
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
相关产品推荐
相关产品推荐

