Включить заголовки при использовании SELECT INTO OUTFILE? - PullRequest
104 голосов
/ 09 мая 2011

Можно ли как-то включить заголовки при использовании MySQL INTO OUTFILE?

Ответы [ 17 ]

141 голосов
/ 10 мая 2011

Вы должны были бы жестко закодировать эти заголовки самостоятельно.Что-то вроде:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'
76 голосов
/ 28 ноября 2012

Решение, предоставленное Джо Стейнелли, работает, но составление списка столбцов неудобно, когда задействованы десятки или сотни столбцов. Вот как получить список столбцов таблицы my_table в my_schema .

-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result
set session group_concat_max_len = 1000000;

select GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'"))
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'my_table'
AND TABLE_SCHEMA = 'my_schema'
order BY ORDINAL_POSITION

Теперь вы можете скопировать и вставить полученную строку как первый оператор в методе Джо.

13 голосов
/ 08 августа 2014

Для сложного выбора с ORDER BY я использую следующее:

SELECT * FROM (
    SELECT 'Column name #1', 'Column name #2', 'Column name ##'
    UNION ALL
    (
        // complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
    )
) resulting_set
INTO OUTFILE '/path/to/file';
6 голосов
/ 23 марта 2017

Я просто делаю 2 запроса, во-первых, чтобы получить выходные данные запроса (ограничение 1) с именами столбцов (без жесткого кода, без проблем с объединениями, упорядочением по, именами пользовательских столбцов и т. Д.), А затем с помощью самого запроса и объединения файловв один файл CSV:

CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /'\;'/g"`
echo "\'$CSVHEAD\'" > $TMP/head.txt
/usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile '${TMP}/data.txt' fields terminated by ';' optionally enclosed by '\"' escaped by '' lines terminated by '\r\n';"
cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
5 голосов
/ 04 сентября 2018

Я столкнулся с подобной проблемой при выполнении запроса mysql для больших таблиц в NodeJS. Подход, который я использовал, чтобы включить заголовки в мой файл CSV, выглядит следующим образом

  1. Используйте запрос OUTFILE для подготовки файла без заголовков

        SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED 
        BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
    
  2. Получить заголовки столбцов для таблицы, используемой в точке 1

        select GROUP_CONCAT(CONCAT(\"\",COLUMN_NAME,\"\")) as col_names from 
        INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = [TABLE_NAME] AND TABLE_SCHEMA 
        = [DATABASE_NAME] ORDER BY ORDINAL_POSITION
    
  3. Добавьте заголовки столбцов к файлу, созданному на шаге 1, используя prepend-file npm package

Выполнение каждого шага контролировалось с помощью обещаний в NodeJS.

5 голосов
/ 01 сентября 2016

Это позволит вам иметь заказанные столбцы и / или ограничение

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
    FROM YourTable order by ColName1 limit 3) a
    INTO OUTFILE '/path/outfile';
5 голосов
/ 03 октября 2013

Вы можете использовать подготовленное утверждение с ответом Лючека и динамически экспортировать таблицу с именем столбца в CSV:

--If your table has too many columns
SET GLOBAL group_concat_max_len = 100000000;
--Prepared statement
SET @SQL = ( select CONCAT('SELECT * INTO OUTFILE \'YOUR_PATH\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\\n\' FROM (SELECT ', GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")),' UNION select * from YOUR_TABLE) as tmp') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE' AND TABLE_SCHEMA = 'YOUR_SCHEMA' order BY ORDINAL_POSITION );
--Execute it
PREPARE stmt FROM @SQL;
EXECUTE stmt;

Спасибо, Лючек.

3 голосов
/ 25 июля 2015

Это альтернативный чит, если вы знакомы с Python или R, и ваша таблица может поместиться в памяти.

Импортируйте таблицу SQL в Python или R, а затем экспортируйте оттуда как CSV, и вы получите имена столбцов и данные.

Вот как я это делаю, используя R, требует библиотеку RMySQL:

db <- dbConnect(MySQL(), user='user', password='password', dbname='myschema', host='localhost')

query <- dbSendQuery(db, "select * from mytable")
dataset <- fetch(query, n=-1)

write.csv(dataset, 'mytable_backup.csv')

Это немного обманывает, но я обнаружил, что это был быстрый обходной путь, когда мое число столбцов было слишком длинным, чтобы использовать метод concat, описанный выше. Примечание: R добавит столбец «row.names» в начале CSV, так что вы захотите удалить его, если вам нужно полагаться на CSV для воссоздания таблицы.

2 голосов
/ 08 июля 2016

Итак, если все столбцы в my_table являются символьными типами данных , мы можем объединить верхние ответы (Джо, Мэтта и evilguc) вместе, чтобы заголовок автоматически добавлялся в один 'простой 'SQL-запрос, например

select * from (
  (select column_name
    from information_schema.columns
    where table_name = 'my_table'
    and table_schema = 'my_schema'
    order by ordinal_position)
  union all
  (select *  // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
  from my_table)) as tbl
into outfile '/path/outfile'
fields terminated by ',' optionally enclosed by '"' escaped by '\\'
lines terminated by '\n';

, где последние несколько строк выводят csv.

Обратите внимание, что это может быть медленным, если my_table очень большой.

1 голос
/ 07 сентября 2017

Поскольку функциональность «include-headers» еще не встроена, и большинству «решений» здесь необходимо вводить имена столбцов вручную и / или даже не принимать во внимание объединения, яd рекомендую обойти проблему .

  • Лучшая альтернатива, которую я нашел до сих пор, - использовать приличный инструмент (я использую HeidiSQL ).
    Поставьте свой запрос, выберите сетку, просто щелкните правой кнопкой мыши и экспортируйте в файл.У него есть все необходимые параметры для чистого экспорта, и он должен удовлетворять большинство потребностей.

  • В той же идее подход user3037511 работает отлично, и его можно легко автоматизировать .
    Просто запустите ваш запрос с некоторой командной строкой , чтобы получить заголовки.Вы можете получить данные с помощью SELECT INTO OUTFILE ... или запустив свой запрос без ограничения, на ваше усмотрение.

    Обратите внимание, что перенаправление вывода в файл работает как чудо как в Linux, так и в Windows.


Это заставляет меня хотеть выделить это 80% времени, когда я хочу использовать SELECT FROM INFILE или SELECT INTO OUTFILE, я заканчиваю тем, что использую что-то еще из-за некоторых ограничений (здесь: отсутствие «опций заголовков» в AWS-RDS, отсутствие прав и т. Д.)

Следовательно, я не совсем отвечаю наОП вопрос ... но он должен отвечать на его потребности :)
РЕДАКТИРОВАТЬ: и фактически ответить на его вопрос: нет
Начиная с 2017-09-07, вы просто не можете включать заголовки, если придерживаетесь команды SELECT INTO OUTFILE
: |

...