我有一个int(10)unsigned类型的price列,但是由于某些原因,我需要将列的类型更改为decimal(3,2),我如何才能做到这一点而不丢失已经用int(10)存储的数据呢?
ALTER TABLE packages MODIFY price decimal(3,2)
但是这个命令把所有值都改成了9,99?我怎样才能把痛苦降到最低?
bmvo0sr51#
你的价格可能会被降到你给出的最大允许小数。
DELIMITER $$ CREATE PROCEDURE statement(IN dynamic_statement TEXT) BEGIN SET @dynamic_statement := dynamic_statement; PREPARE prepared_statement FROM @dynamic_statement; EXECUTE prepared_statement; DEALLOCATE PREPARE prepared_statement; END; DELIMITER ; SET @var_digit_length := (SELECT MAX(CEIL(LOG(10, ABS(price)))) FROM packages) ; SET @var_precision := 2; CALL statement(CONCAT(' ALTER TABLE packages MODIFY price decimal(', (@var_digit_length + @var_precision), ',', @var_precision, '); ')); DROP PROCEDURE statement;
wztqucjr2#
如果您不需要备份和/或只想转换数据类型,只需通过此sql脚本转换数据类型:/* 转换列数据类型 */ALTER TABLE价格表修改列价格列小数(3,2);
2条答案
按热度按时间bmvo0sr51#
你的价格可能会被降到你给出的最大允许小数。
wztqucjr2#
如果您不需要备份和/或只想转换数据类型,只需通过此sql脚本转换数据类型:
/* 转换列数据类型 */
ALTER TABLE价格表修改列价格列小数(3,2);