2008-10-23 88 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和外鍵(我注意到這是標記性能,這可能不會給出最佳「性能」)。