我有一个包含所有varchar类型列的表,但数据实际上是数字,即十进制(6,2)更合适。如果有很多列,如何将varchar中的所有列更改为十进制。 非常感谢您的帮助。
答案 0 :(得分: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。如果只有几列,那么手动操作可能更容易。
答案 1 :(得分: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
来查找和过滤它,以查看其中有多少可能超出范围或不可转换(例如空白或文本数字)。
是的,这种方法需要一些时间,但是一旦你对此感到满意,你可以将所有MODIFY COLUMN
子句组合到一个语句中并在真实表上运行它。