【问题标题】:Converting column type in MySQL在 MySQL 中转换列类型
【发布时间】:2014-05-20 12:28:56
【问题描述】:

我不得不从 CSV 文件中引入一大堆表格。许多这些文件的列是 INT 但有空值。为了加快导入速度,我刚刚制作了所有列 VARCHAR。现在我在表中有所有这些数据,但需要更改类型。除了一个问题外,我可以在 MySQL 工作台中执行此操作——错误是因为 null/blank 值。是否有某种 SQL 魔法可以让我转换这些列类型并忽略空值或用该数据类型的正确“空值”替换它们?

【问题讨论】:

  • 正确的空值是什么意思?
  • 好吧,我的意思是总体上为空。我这样说是因为我不知道 varchar 的 null 是否为 'null' 而 int 可能是 \0 - 我真的只是说 null。

标签: mysql types sqldatatypes


【解决方案1】:

您可以更新列以将空白字段设置为 NULL,如下所示:

UPDATE mytable SET mycolumn=NULL WHERE TRIM(mycolumn,' ')='';

然后你的普通表改变如下:

ALTER TABLE mytable MODIFY mycolumn VARCHAR(255);

“DEFAULT NULL”是可选的,因为字段默认允许为空。这应该允许您将列转换为您希望的任何数据类型而不会出现任何问题,除非存在混合数据(例如数字和字符串)并且您希望将该列设为 FLOAT。

上面的例子也没有考虑删除回车等,如果列包含“\n”或“\r\n”而没有其他内容,它不会将其设置为NULL,但是如果您有这些要求,您可以修改“TRIM(mycolumn, ' ')”以满足这些要求:aka ...

UPDATE mytable SET mycolumn=NULL WHERE TRIM(mycolumn,"\n")='';

【讨论】:

  • 谢谢,我使用的确切查询是 UPDATE table SET column = NULL WHERE column = '';
  • 所以它肯定是预先修剪的空白。棒极了。我提供了 TRIM() 的版本,因为这有助于覆盖列中可能会阻止搜索为空的其他杂散字符,但您希望将其他数据保留在同一列中
  • 不是逐列执行此操作,有没有办法对所有列执行一次操作以将 '' 替换为 NULL? (我不是真正的 SQL 人 :))
  • 我不确定。并非没有中间的解释器,或者使用存储过程来遍历列。我知道使用直接 SQL 的方法会将所有列更新为空白。此外,无论如何你都需要 ALTER 表,所以我认为没有办法(至少我知道)可以完全自动化。你用的是什么前端语言? (PHP/ASP/等)
  • 我只是从 MySQL 命令行执行此操作。最终项目使用的是 Java。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2018-05-13
  • 2016-09-14
  • 2019-08-13
  • 1970-01-01
相关资源
最近更新 更多