使用mysqlimport时添加一列

时间:2012-11-30 18:54:13

标签: mysql mysqlimport

我正在使用mysqlimport使用bash脚本将5个不同的csv文件导入到公共数据库表中。

File[0]=one
File[1]=two
File[2]=three
File[3]=four
File[4]=five

for i in 0 1 2 3 4 5 6 7 8 9 10  
do 
   mysqlimport --fields-optionally-enclosed-by=\" --fields-terminated-by=, --lines-terminated-by="<br />\n" -uusername -ppassword --local tablename /path/${File[i]}.txt
done

现在我想在公共表中添加一个额外的列,每个文件都有一个唯一的id。例如。对于one.csv的所有条目,id将具有值1.

有没有办法可以在通过bash脚本导入的同时执行此操作?我不想每次都去mysql控制台并从那里开始。

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:2)

首先,mysqlimport只是LOAD DATA INFILE SQL statement的包装,虽然mysqlimport是一个很好的方便,但它有一些限制会使你想要做的事情变得困难,即:

  1. 您无法指定表名,它会从文件名
  2. 中推断出表名
  3. 你希望使用的选项,你可以在导入时set字段到给定值,但作为mysqlimport的选项不存在(虽然它确实存在于裸SQL上! )
  4. 因此,你可能想跳过mysqlimport并直接执行sql语句。

    这样的事情应该做:

    File[0]=one
    File[1]=two
    File[2]=three
    File[3]=four
    File[4]=five
    
    for i in 0 1 2 3 4 5 6 7 8 9 10  
    do
      qry="LOAD DATA LOCAL INFILE '/path/${File[i]}.txt' INTO TABLE tablename FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\"' LINES TERMINATED BY \"<br />\n\"  (list,comma,separated,column,names,here) SET source_id='$i'"
    
      mysql -uusername -ppassword << eof
      $qry
      eof
    done
    

    SET source_id='$i'字段是导入时设置该字段的关键。

    注意:此代码未经测试,但它应该让您朝着正确的方向前进,只需阅读LOAD DATA INFILE的mysql手册,然后google“mysql bash”。

答案 1 :(得分:0)

这样的方法怎么样:

#!/bin/bash

echo>/tmp/tmpfile.csv

for i in 0 1 2 3 4 5 6 7 8 9 10
do
  for j in `cat ${FILE[i]}.TXT`; do echo $i,$j>>/tmp/tmpfile.csv; done
done

mysqlimport ..... --table localfile /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv

当然这是不完整/未经测试的代码,但您可以首先创建一个包含已添加列的完整文件,然后导入该文件。

你也可以绕过mysqlimport并类似地构造sql:

#!/bin/bash

echo>/tmp/tmpfile.csv

for i in 0 1 2 3 4 5 6 7 8 9 10
do
  for j in `cat ${FILE[i]}.TXT`; do echo "insert into tablename (a,b,c,d,e) values ($i,$j);">>/tmp/tmpfile.csv; done
done

mysql -D dbname -u user --password=pass < /tmp/tmpfile.csv
rm -f /tmp/tmpfile.csv