2010-05-13 8 views
0

J'essaie d'exporter un champ d'une très grande table - contenant 5 000 000 enregistrements, par exemple - dans une liste csv - mais pas tous ensemble, plutôt , 100 000 enregistrements dans chaque fichier .csv créé - sans duplication. Comment puis-je faire cela, s'il vous plaît?Comment exporter une grande table en 50 petits fichiers CSV de 100 000 enregistrements chacun

J'ai essayé

SELECT field_name 
    FROM table_name 
WHERE certain_conditions_are_met 
    INTO OUTFILE /tmp/name_of_export_file_for_first_100000_records.csv 
     LINES TERMINATED BY '\n' 
LIMIT 0 , 100000 

qui donne les 100000 premiers disques, mais rien que je ne les a d'autres 4.900.000 enregistrements exportés dans 49 autres fichiers - et comment puis-je spécifier les 49 autres noms de fichiers?

par exemple, j'essayé ce qui suit, mais la syntaxe SQL est erronée:

SELECT field_name 
    FROM table_name 
WHERE certain_conditions_are_met 
    INTO OUTFILE /home/user/Eddie/name_of_export_file_for_first_100000_records.csv 
     LINES TERMINATED BY '\n' 
LIMIT 0 , 100000 
    INTO OUTFILE /home/user/Eddie/name_of_export_file_for_second_100000_records.csv 
     LINES TERMINATED BY '\n' 
LIMIT 100001 , 200000 

et qui n'a pas créé le second fichier ...

ce que je fais mal, s'il vous plaît, et Y a-t-il une meilleure manière de faire cela? Est-ce que le LIMIT 0, 100000 doit être placé avant la première instruction INTO OUTFILE, puis répétez la commande entière de SELECT pour les 100.000 autres enregistrements, etc.?

Merci pour toute aide.

Eddie

Répondre

3

Si vous utilisez un système d'exploitation comme UNIX, pourquoi ne pas simplement sélectionner le lot entier et redirigez la sortie vers:

split --lines=100000 

Comme preuve de concept:

echo '1 
2 
3 
4 
5 
6 
7 
8 
9' | split --lines=3 

crée trois fichiers xaa, xab et xac contenant les lignes 1,2,3, 4,5,6 et 7,8,9 respectivement.

Ou, même sur d'autres systèmes d'exploitation, vous pouvez obtenir les outils GNU, comme GnuWin32, où split est dans coreutils.

3

Vous pouvez utiliser la boucle et la sous-requête pour générer les fichiers. procédure suivante peut vous donner une idée comment faire cela (il peut avoir une erreur de syntaxe):

CREATE PROCEDURE exportSplitter(partsCount) 
BEGIN 
    SET rowCount = select count(*) from table; 
    SET pageRowCount = rowCount/partsCount; 
    SET p1 = 0; 
    label1: LOOP 
    SET p1 = p1 + 1; 
    SELECT field_name 
     FROM (SELECT * from table_name WHERE certain_conditions_are_met order by id LIMIT p1*pageRowCount) order by id desc LIMIT pageRowCount 
     INTO OUTFILE /home/user/Eddie/p1 
      LINES TERMINATED BY '\n' 
    IF p1 < partCount THEN ITERATE label1; END IF; 
    LEAVE label1; 
    END LOOP label1; 
END 
Questions connexes