Строка CONCAT и INT в MYSQL и экспорт большой таблицы mysql в небольшие файлы csv

Я новичок в программировании MYSQL. Я хочу выбрать в outfile очень большую таблицу в несколько файлов csv, используя сценарий цикла MYSQL. Мой сценарий выглядит следующим образом:

BEGIN
        SET @t_lines=0;
        SET @t_count=0;
        SET @t_filepath='/home/ab/path/table_name_02212013_';
        WHILE t_lines<=5000000
        SET @t_filename=CONCAT(@t_filepath,CAST(@t_count as CHAR));
        select * into outfile @t_filename fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' from table_name limit @t_lines,@t_lines+300000;
        SET @t_lines= @t_lines+300000;
        SET @t_count= @t_count+1;
        END WHILE;
        COMMIT;
END

Я получил синтаксическую ошибку в строке:

SET @t_filename=CONCAT(@t_filepath,CAST(@t_count как CHAR));

Синтаксическая ошибка, вызванная WHILE ... DO. Спасибо за быстрый ответ. Здесь у меня все еще есть синтаксическая ошибка в «@t_lines,@t_lines+300000» после «limit». Я разобрался, кажется, «ограничение» не позволяет «@t_lines+300000» указывать диапазон строк. Это можно исправить, указав новую переменную:

   BEGIN
            DECLARE t_lines INT DEFAULT 0;
            DECLARE t_count INT DEFAULT 0;
            DECLARE t_endlines INT DEFAULT 300000;
            DECLARE t_linerange INT DEFAULT 300000;
            SET @t_filepath='/home/ab/path/table_name_02212013_';
            WHILE t_lines<=5000000 DO
            SET @t_filename=CONCAT(@t_filepath,CAST(@t_count as CHAR));
            select * into outfile '@t_filename' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' from table_name limit t_lines,t_endlines;
            SET t_lines= t_lines+t_linerange;
            SET t_endlines= t_endlines+t_linerange
            SET t_count= t_count+1;
            END WHILE;
            COMMIT;
    END

Спасибо большое


person zhihong    schedule 21.02.2013    source источник


Ответы (3)


синтаксис цикла WHILE в MySQL требует DO;

WHILE t_lines<=5000000 DO
...
END WHILE;
person Joachim Isaksson    schedule 21.02.2013
comment
Спасибо, никогда не забуду DO после повторного использования WHILE - person zhihong; 21.02.2013

Аргумент имени файла для INTO OUTFILE должен быть буквальной строкой. Вы не можете использовать переменные или выражения в качестве имени файла.

Аргументы LIMIT должны быть целочисленными константами. Вы можете использовать заполнители параметров (?), параметры хранимой процедуры или локальные переменные процедуры (те, которые вы DECLARE). Но вы не можете использовать переменные сеанса (с префиксом @), вы также не можете использовать выражения.

Вам нужно будет создать запрос в виде строки SQL, интерполируя значения в строку.
Затем используйте эту строку SQL с PREPARE и EXECUTE.

person Bill Karwin    schedule 21.02.2013
comment
большое спасибо за указание на ошибки. Уже изменились, чтобы использовать глобальные переменные. - person zhihong; 21.02.2013

Пытаться :

convert(columnName, char)

-->

BEGIN
        SET @t_lines=0;
        SET @t_count=0;
        SET @t_filepath='/home/ab/path/table_name_02212013_';
        WHILE t_lines<=5000000
        SET @t_filename=CONCAT(@t_filepath,convert(@t_count, CHAR));
        select * into outfile @t_filename fields terminated by ',' optionally enclosed by '"' lines terminated by '\n' from table_name limit @t_lines,@t_lines+300000;
        SET @t_lines= @t_lines+300000;
        SET @t_count= @t_count+1;
        END WHILE;
        COMMIT;
END
person Pheonix    schedule 21.02.2013