【发布时间】:2016-03-21 18:09:30
【问题描述】:
我在表格中有 2 列的条目不正确。表的大小达到数十亿条记录。我想在两列(c1 和 C2)之间交换数据 采用的方法是将数据以小块的形式导出到 CSV 文件中,然后使用更正的条目将其导入回来。比如下面是数据集
--------
|C1 | C2 |
|3 | 4 |
|4 | 6 |
然后我会将数据导出到以分号分隔的 CSV 文件(未显示完整命令),如下所示
SELECT C2,C1 FROM TABLE temp INTO OUTFILE /tmp/test.csv
这样的命令的输出是
4;3
6;4
当我导入回数据时(删除有问题的数据后),数据将按如下方式更正
| C1 C2 |
| 3 4 |
| 4 6 |
确实是OUTFILE和INFILE操作的问题,我相信
问题
- 这种方法有意义吗?真实数据也期望 NULL, int 除了数据交换之外,某些列中的值。
- 另一个复杂性在于生产数据库,我需要 使用 WHERE 子句。表名也将被获取 动态的。
- 参考第 2 点,如何为查询添加动态性。 我应该使用 STORED 过程还是 SHELL SCRIPT?存储过程 似乎不支持 LOAD DATA INFILE 功能。
- 如果我只剩下 shell,我可以重复使用任何示例脚本吗? CSV 文件名、表名和 WHERE 子句必须在运行时构建 时间。
- 还将动态计算要导出和导入的块的大小。
- 还有其他方法吗?
注意 - 这是一个基于 mysql 的 INFOBRIGHT 列的表。 UPDATE 查询无效,INFOBRIGHT 不支持 ALTER TABLE。
【问题讨论】:
-
1) 这是一个非常广泛的问题,答案可能主要基于意见。 2)这里没有问题。 3) 存储过程中不允许将数据加载到文件中。 4)同样,一个过于宽泛的问题。不太可能有人会从头开始为您编写脚本。 5) 同样,这里没有问题 6) 这与 1) 基本相同。所以,我不太清楚你在这里期待什么样的答案。
-
只需使用数据库中的新表将数据复制到。转换完所有数据后,删除原始数据并将新表重命名为原始数据
标签: mysql shell csv stored-procedures infobright