Pregunta

¿Cuál es la forma más rápida de cargar datos de archivos planos en una base de datos MySQL y luego crear las relaciones entre las tablas mediante claves externas?

Por ejemplo ... Tengo un archivo plano en el formato:

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

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

Que necesito cargar en cuatro tablas:

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

Específicamente, ¿cómo se pueblan las claves foráneas de una manera que escala? Las cifras están en el rango de más de 1000 individuos, cada uno con más de 1 millón de genotipos.

¿Fue útil?

Solución

Hay una forma más sencilla.

Primero, asegúrese de tener una restricción ÚNICA en aquellas columnas que deberían tener una (nombre, población, rsid).

Luego usa algo como lo siguiente:

 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);

Observe dónde se usa @ para indicar variables, en lugar de nombres de columnas. En los primeros 2 CARGAR DATOS, estos solo se usan para ignorar los datos. En el segundo 2, se utilizan para buscar las claves externas.

Puede que no sea muy rápido, mente :).

Otros consejos

Tomaría un enfoque de múltiples pasos para hacer esto.

  1. Cargue los datos en una tabla temporal, que coincida con el formato de archivo que tiene
  2. Escriba consultas para hacer las otras inserciones, comenzando las tablas generales, luego haciendo combinaciones para obtener los valores FK.

Podría comenzar con las tablas base sin claves foráneas. Luego, buscará las ID a medida que inserta datos en las otras tablas.

Otra idea es que podría reemplazar las ID en el archivo plano (INDIVIDUAL1, CEU, ... etc.) por GUID. y luego úselos directamente como ID y claves foráneas (noté que esto está etiquetado como rendimiento, esto puede no dar el mejor "rendimiento").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top