4

将数据从平面文件加载到 MySQL 数据库中,然后通过外键创建表之间关系的最快方法是什么?

例如......我有一个格式为:

[INDIVIDUAL]   [POP]  [MARKER]  [GENOTYPE]

"INDIVIDUAL1", "CEU", "rs55555","AA"  
"INDIVIDUAL1", "CEU", "rs535454","GA"  
"INDIVIDUAL1", "CEU", "rs555566","AT"  
"INDIVIDUAL1", "CEU", "rs12345","TT"  
...  
"INDIVIDUAL2", "JPT", "rs55555","AT"  

我需要将其加载到四个表中:

IND (id,fk_pop,name)  
POP (id,population)  
MARKER (id,rsid)  
GENOTYPE (id,fk_ind,fk_rsid,call)  

具体来说,如何以一种可扩展的方式填充外键?这些数字在 1000 多个人的范围内,每个人都有 100 万多个基因型。

4

3 回答 3

9

我会采取多步骤的方法来做到这一点。

  1. 将数据加载到与您拥有的文件格式匹配的临时表中
  2. 编写查询以执行其他插入,启动通用表,然后执行连接以获取 FK 值。
于 2008-10-23T18:36:36.587 回答
4

有一个更简单的方法。

首先,确保您对那些应该有一个(名称、人口、rsid)的列有一个唯一约束。

然后使用类似下面的东西:

 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE POP FIELDS TERMINATED BY ','
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, population, @rsid, @call);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE MARKER FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, @population, rsid, @call);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE IND FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (name, @population, @rsid, @call) 
    SET fk_pop = (SELECT id FROM POP WHERE population = @population);
 LOAD DATA INFILE 'data.txt' IGNORE INTO TABLE GENOTYPE FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES 
    (@name, @population, @rsid, call)
    SET fk_ind = (SELECT id FROM IND where name = @name),
    fk_rsid = (SELECT id FROM MARKER where rsid = @rsid);

请注意 @ 用于指示变量而不是列名的位置。在前 2 个 LOAD DATA 中,这些仅用于忽略数据。在第二个 2 中,它们用于查找外键。

可能不是很快,请注意:)。

于 2009-01-16T03:05:15.700 回答
0

您可以从没有外键的基表开始。然后,您将在其他表中插入数据时查找 ID。

另一个想法是您可以用 GUIDs 替换平面文件(INDIVIDUAL1,CEU,...等)中的 ID。然后直接将它们用作 ID 和外键(我注意到这是标记的性能,这可能不会提供最佳的“性能”)。

于 2008-11-01T08:56:12.653 回答