1

我有一个表,其中包含所有 varchar 类型的列,但数据实际上是数字,即十进制(6,2)会更合适。如果有很多列,如何将所有列从 varchar 更改为 decimal。非常感谢您的帮助。

4

2 回答 2

2

您可以使用 将单个列更改为十进制ALTER TABLE tablename MODIFY COLUMN columnname DECIMAL(6,2);。任何可以转换为数字的字符串都将被转换,其他的将被更改为零。

如果您想确定以非破坏性方式执行此操作,您可以改为ALTER TABLE ADD COLUMN添加一个小数列,然后添加,然后UPDATE tablename SET decimalcolumn = textcolumn使用 SELECT 检查任何不相等的行(它会将类型转换作为比较,所以和是相等的,如你所愿)。 textcolumndecimalcolumn"5"5.00

我不知道有一种方法可以一次自动将相同的转换应用于多个列,尽管您可以使用 PHP 或其他编程语言通过从表中选择一行、遍历返回的列并运行 MODIFY 来实现每一个人。如果只有几列,手动完成可能更容易。

于 2012-04-11T23:25:39.560 回答
1

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子句组合到一个语句中并在真实表上运行它。

于 2012-04-12T00:24:44.770 回答