我有一个表,其中包含所有 varchar 类型的列,但数据实际上是数字,即十进制(6,2)会更合适。如果有很多列,如何将所有列从 varchar 更改为 decimal。非常感谢您的帮助。
2 回答
您可以使用 将单个列更改为十进制ALTER TABLE tablename MODIFY COLUMN columnname DECIMAL(6,2);
。任何可以转换为数字的字符串都将被转换,其他的将被更改为零。
如果您想确定以非破坏性方式执行此操作,您可以改为ALTER TABLE ADD COLUMN
添加一个小数列,然后添加,然后UPDATE tablename SET decimalcolumn = textcolumn
使用 SELECT 检查任何不相等的行(它会将类型转换作为比较,所以和是相等的,如你所愿)。 textcolumn
decimalcolumn
"5"
5.00
我不知道有一种方法可以一次自动将相同的转换应用于多个列,尽管您可以使用 PHP 或其他编程语言通过从表中选择一行、遍历返回的列并运行 MODIFY 来实现每一个人。如果只有几列,手动完成可能更容易。
MySQL 的ALTER TABLE
语句支持一次更改多个列。事实上,在一个语句中尽可能多地更改表的模式是首选和强烈推荐的。这是因为 MySQL 复制整个表来进行模式更改,但每个ALTER TABLE
语句只复制一次。在修改非常大的表时,这是一个重要的节省时间!
也就是说,您可以通过几种方式排练您的更改。
首先,我会使用开发数据库来测试所有这些,而不是生产数据库。然后您可以使用CREATE TABLE ... LIKE ...
来创建一个结构相同的表,然后使用INSERT INTO ... SELECT * FROM ...
来复制数据。现在您可以尝试使用ALTER TABLE ... MODIFY COLUMN ... DECIMAL(6,2)
. 如果您在一个列上执行此操作并收到消息0 Warnings
,那么该列将毫无意外地转换,您可以测试下一个列。如果您确实收到警告,那么SHOW WARNINGS
将显示其中的一些,以便您知道 MySQL 遇到了什么问题。
根据您对数据的了解程度,您还可以执行许多不同SELECT
的 s 来查找和过滤它,以查看其中有多少可能超出范围或无法转换(例如,空白或文本而不是数字)。
是的,这种方法需要一些时间,但是一旦您对此感到满意,您可以将所有MODIFY COLUMN
子句组合到一个语句中并在真实表上运行它。