mysql - 数据库将 CSV 加载到多个表中

标签 mysql database unix bulk-load

更新:添加了一个示例来阐明数据的格式。

考虑每行格式如下的 CSV:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,[tbl2.col1:tbl2.col2]+

其中 [tbl2.col1:tbl2.col2]+ 表示可以重复任意数量的这些对

例如:

tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2,tbl2.col1:tbl2.col2

这些表将使用行号作为键相互关联,除了上述任何列之外还必须创建该键。

  1. 有没有办法使用mysql加载 data infile 加载数据到 两个单独的表?
  2. 如果没有,什么 Unix 命令行工具 最适合这个吗?

最佳答案

不,不是直接的。加载数据只能插入到一个表或分区表中。

您可以做的是将数据加载到临时表中,然后使用insert into 将各个列选择到 2 个最终表中。如果您对 tbl2 的值使用不同的分隔符,您可能还需要 substring_index。行号由登台表中的自动递增列处理(最简单的方法是将自动列放在登台表定义中的最后)。

格式不是很清楚,最好用 perl/php/python 完成,但如果你真的想使用 shell 工具:

cut -d , -f 1-5 file | awk -F, '{print NR "," $0}' > table1

cut -d , -f 6- file | sed 's,\:,\,,g' | \
  awk -F, '{i=1; while (i<=NF) {print NR "," $(i) "," $(i+1); i+=2;}}' > table2

这将创建具有以下内容的表 1 和表 2 文件:

1,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
2,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5
3,tbl1.col1,tbl1.col2,tbl1.col3,tbl1.col4,tbl1.col5

1,tbl2.col1,tbl2.col2
1,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
2,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2
3,tbl2.col1,tbl2.col2

关于mysql - 数据库将 CSV 加载到多个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129076/

相关文章:

php - 将基本的 PHP/MySql 转换为 ASP 以查询 MS Sql 数据库

php - 拉维尔 5 : Database Migrations (Help! )

javascript - 如果已经存储了这样的唯一值,如何重新尝试插入数据库

MySQL 数据库设计问题 - 存储索引列表/数组

linux - 从 grep 输出中删除 </p> 标签

c - ncurses:窗口颜色不起作用

mysql - 如果 value 为 0,为什么 SELECT ... WHERE id = a 返回结果

Python-SqlAlchemy : Filter query by great circle distance?

ruby-on-rails - ' rake ' "in order to" 'rake'

unix - 使用 wget 下载图片文件夹