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