2008-10-23 20 views
4

将平面文件中的数据加载到MySQL数据库,然后通过外键创建表之间的关系的最快方法是什么?将平面文件加载到规范化的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万以上的基因型。

+0

感谢您的建议,迄今为止......虽然目前我不得不通过编程方式管理外键之前加载 – pufferfish 2008-11-01 17:28:26

回答

4

有一个更简单的方法。

首先,确保你对那些应该有一个(name,population,rsid)的列有一个UNIQUE约束。

然后使用类似以下内容:

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中,它们用于查找外键。

可能不是很快,介意:)。

9

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

  1. 将数据加载到一个临时表,即匹配,你有
  2. 编写查询做其他的插入,启动了总表的文件格式,然后做连接,以获得FK值。
0

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

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