Sql 将两个(或多个)文件中的数据加载到一个表中

Sql 将两个(或多个)文件中的数据加载到一个表中,sql,mysql,Sql,Mysql,我有一张桌子: CREATE TABLE t ( id INT NOT NULL PRIMARY KEY, x INT NOT NULL, y INT NOT NULL ); 数据位于两个文件中:一个文件具有(id,x)值对,另一个文件具有(id,y)值对。每行大约有2000万行。出现在x文件中的大多数id值也出现在y文件中,反之亦然 您能否建议如何将两个文件中的id、x和y值加载到t中?使用加载数据填充将每个文件加载到两个单独的表中。然后使用插入到。。。选择将数据插入表t。如果您

我有一张桌子:

CREATE TABLE t (
  id INT NOT NULL PRIMARY KEY,
  x INT NOT NULL,
  y INT NOT NULL );
数据位于两个文件中:一个文件具有
(id,x)
值对,另一个文件具有
(id,y)
值对。每行大约有2000万行。出现在
x
文件中的大多数
id
值也出现在
y
文件中,反之亦然


您能否建议如何将两个文件中的
id
x
y
值加载到
t
中?

使用加载数据填充将每个文件加载到两个单独的表中。然后使用插入到。。。选择将数据插入表t。

如果您在unix计算机上,您可以访问“连接”,它可以将两个文件连接在一起并在标准输出上生成它们。将标准直接批量加载到mysql中。这将减少写入磁盘的次数。

如果一个表有一行
(id=23,x=55)
,而另一个表有一行
(id=23,y=126)
,我需要在
t
中以一行
(id=23,x=55,y=126)
结束。将第一个插入
t
很简单。但从第二个插入时,将出现重复的键。是否插入到选择。。。在重复密钥更新时y=。。。可以这样做吗?不,不可以,但是您可以在SELECT中进行完全外部连接(不幸的是,由于MySQL还不支持完全外部连接语法,所以通过联合右连接和左连接,这是一项有点难度的工作),我不同意您关于联合的建议。我也不明白为什么,如果
t.id
t
的主键,
插入到t(id,y)中,在重复密钥更新时从tmptbl选择tt.key,tt.val y=tt.valtmptbl(key,val)
是我将数据文件加载到的临时表,那么code>将不起作用。我再次检查,并插入到。。选择不支持重复密钥更新子句。不知怎的,我以为我没有。对你来说问题少了嗨,麦克尔,如果你编辑你的答案提到重复的密钥更新,那么我会接受它。这很有趣。我试试看。顺便说一句:根据手册页,join(1)要求输入文件按键列排序。@fsb,我过去经常在托管位置之间执行ssh/gzip/dump/load操作。您当然可以将这两个文件加载到mysql中,然后将它们连接到另一个表中。虽然我喜欢使用管道来减少磁盘io,但这可能是无关紧要的。只要排序(1)产生与MySQL相同的顺序就可以了,这在本例中是正确的,因为我们按唯一的INT进行排序。但是如果对字符串进行排序,排序(1)通常不会使用与MySQL相同的排序规则,因此join(1)产生的结果与MySQL中的join不同。这是值得注意的。@fsb,谢谢你的更新。MySQL的排序顺序与sort(1)的不同对您有何影响?正如我所说,本例中的排序顺序在sort(1)和MySQL中是相同的,因此没有问题。我只是添加了这条评论,以便将来阅读此对话的其他人能够了解MySQL对字符串排序与排序(1)的区别。