如何将大表导出为50个较小的csv文件,每个文件包含100,000条记录

时间:2010-05-13 11:21:37

标签: mysql export limit file-io

我正在尝试将一个字段从一个非常大的表(例如,包含5,000,000条记录)导出到一个csv列表中 - 但不是全部,而是创建每个.csv文件中的100,000条记录 - 没有重复。我该怎么办呢?

我试过

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

给出前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

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

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

感谢您的帮助。

埃迪

2 个答案:

答案 0 :(得分:3)

如果您在类UNIX操作系统上运行,为什么不选择整批产品并通过以下方式管道输出:

split --lines=100000

作为概念证明:

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

分别创建包含行xaaxabxac的三个文件1,2,34,5,67,8,9

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

答案 1 :(得分: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