2010-05-13 56 views
0

我试图从一个非常大的表(例如包含5,000,000条记录)中将一个字段导出到csv列表中 - 但不是全部在一起,而是,创建每个.csv文件100,000个记录 - 无重复。我该怎么做,请吗?如何将大表导入每个100,000条记录的50个小csv文件

我试图

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 

是给人的第一十万条记录,但没有我这样做有其他4,900,000记录导出到其他49个文件 - 以及如何指定其他49名?

例如,我尝试以下,但SQL语法是错误的:

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 

并没有创建第二个文件...

我是什么做错了,请和有一个更好的方法吗? LIMIT 0,100000应放在第一个INTO OUTFILE语句之前,然后从第二个100,000记录的SELECT重复整个命令,等等?

感谢您的任何帮助。

埃迪

回答

3

如果你在UNIX类操作系统上运行,为什么不选择一大堆和管道输出通过:

split --lines=100000 

由于概念证明:

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

创建三个文件xaa,xabxac包含行1,2,3,4,5,6和分别为。

或者,即使在其他操作系统上,您也可以获得GNU工具,如GnuWin32,其中split位于coreutils

3

您可以使用循环和子查询来生成文件。下面的程序可以给你线索如何做到这一点(它可能有语法错误):

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 
相关问题