问题描述
我有一个文件data.csv
,该文件正在进入服务器,并且我想使用data
导入MySQL数据库中的mysqlimport
表。
我的问题是,此文件包含的数据比我实际想要导入的要多得多。它需要我之前的另一台服务器使用,它需要所有这些数据,但我只需要其中的几列。
是否可以指定我要mysqlimport
使用的列?
我认为它看起来像
mysqlimport --columns="field_1","field_2","field_42","field_31","field_16","field_4" db data.csv
,但是表仅包含文件的前6个字段。如果需要,我可以重新排列表格,以便我想要的字段按顺序排列(即,我将运行--columns="field_1","field_4",...
)。
我隐约意识到可以使用sed
来完成此操作,但我很好奇mysqlimport
是否本身就支持它?
编辑:接受的答案并非我所希望的,但我认为答案是,“不,可惜它不支持”。无论如何,请查看可接受的答案和评论以找到解决方法!
解决方法
--columns
选项未命名输入文件的列。它命名要导入到的目标表的列。输入文件的所有字段都需要放在某个地方。您需要在--columns
中具有与输入文件的字段一样多的列。
但并非输入文件的所有字段都需要进入表的列中。
嗯?
这是一个技巧(也可以在LOAD DATA INFILE
中使用):您可以将输入的字段“发送”到表的实际列或会话变量中。该变量将被文件中的每一行输入覆盖,但这没关系。可以将其视为代码项目中的虚拟变量。
示例:我创建了一个包含三列的表。
mysql> create table mytable (one text,two text,four text);
我创建了一个包含四个字段的输入文本文件。
$ cat mytable.csv
one,two,three,four
在这里,我将字段导入到它们各自的列中,通过将字段3放入一个虚拟变量中来跳过它们。
$ mysqlimport --local --columns one,@dummy,four --fields-terminated-by=,test mytable.csv
成功!
mysql> select * from mytable;
+------+------+------+
| one | two | four |
+------+------+------+
| one | two | four |
+------+------+------+