2008-10-23 4 views
4

플랫 파일에서 MySQL 데이터베이스로 데이터를로드하고 외래 키를 통해 테이블 ​​간의 관계를 만드는 가장 빠른 방법은 무엇입니까?정규화 된 MySQL 데이터베이스에 플랫 파일로드

예를 들어 ... 나는 형식의 플랫 파일이 있습니다

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

특히, 어떻게 하나가 외부 키를 채울 않습니다 : 나는 네 개의 테이블에로드 할 필요

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

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

저울 같은 방식으로? 이 수치는 1000+ 개 이상의 유전자형을 가진 1000+ 명 범위입니다.

+0

조언을 주셔서 감사합니다 ... 현재까지로드하기 전에 프로그래밍 방식으로 외래 키를 관리해야하지만 – pufferfish

답변

4

더 간단한 방법이 있습니다.

먼저 열 (이름, 채우기, 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); 

참고 :

그런 다음 다음과 같은 것을 사용합니다. 처음 두 개의 LOAD DATA에서 이들은 단지 데이터를 무시하는 데 사용됩니다. 두 번째 2에서는 외래 키를 조회하는 데 사용됩니다.

매우 빠르지 않을 수도 있습니다. :).

9

이 작업을 수행하려면 여러 단계를 거쳐야합니다.

  1. 로드는 임시 테이블에 데이터를, 그 다음 일을, 당신은 일반 테이블 시작하는 다른 삽입 할
  2. 쓰기 쿼리를,이 파일 형식과 일치하는 FK 값을 얻기 위해 결합된다.
0

외래 키가없는 기본 테이블로 시작할 수 있습니다. 그러면 다른 테이블에 데이터를 삽입 할 때 ID를 조회하게됩니다.

또 다른 아이디어는 플랫 파일 (INDIVIDUAL1, CEU, ... 등)의 ID를 GUID로 바꿀 수 있다는 것입니다. ID 및 외래 키로 직접 사용할 수 있습니다 (태그가있는 성능 인 것으로 나타 났으므로 성능이 가장 좋지 않을 수 있음).