Экспорт таблицы MySQL в файл csv
У меня есть таблица MySQL, которую нужно вынуть как файл csv. Я использовал запрос
SELECT "ID","NAME","SALARY","SAL1","SAL2","SAL3","SAL4","SAL5","SAL6","SAL7","SAL8","SAL9","SAL10","SAL11","SAL12","SAL13","SAL14","SAL15","SAL16","SAL17","SAL18","SAL19","SAL20","SAL21","SAL22","SAL23","SAL24","SAL25","SAL26"
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
Этот запрос работает, что, если у меня есть 200 имен столбцов?
Есть ли способ сделать это, не набрав вручную?
Ответы
Ответ 1
Эта команда почти дает вам то, что вы хотите, и даже работает с удаленным сервером. Единственное предостережение в том, что он генерирует TSV файлы (поля разделяются вкладкой).
mysql mydb -e "select * from mytable" -B > mytable.tsv
Но вы можете преобразовать его в CSV, используя sed, как предложено в этом ответе
mysql mydb -e "select * from mytable" -B | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > mytable.csv
Ответ 2
DESCRIBE addstock25;
Разделите первый столбец и первую 3 записи этого столбца (в зависимости от вашего использования). Вы получите список полей в addstock25.
Это приведет к именам полей, использующим виртуальные таблицы, полученные в ядре... называемой информационной схемой.
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='foo';
Предположим, что имя этого запроса будет sq_fieldnamelist
Итак,
таблица выше имеет один столбец и имеет имена полей таблицы "foo".
Если вы прямо пишете
SELECT (sq_fieldnamelist)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
Mysql выдаст ошибку. "subquery возвращает несколько строк"
Мы должны отредактировать sq_fieldnamelist, чтобы выполнить все записи назад, разделенные запятыми.
Select GROUP_CONCAT(COLUMN_NAME)
FROM
(SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_NAME`='ffd_companies'
LIMIT 3,100
) AS fafa
GROUP BY 'COLUMN_NAME' // this group by is just to make group concat work
Давайте скажем, что это sq_fieldnamelist2
Если мы отредактируем sq_fieldnamelist следующим образом. Он будет возвращать только одно значение, которое представляет собой все имена полей, разделенные запятыми. Итак, теперь мы можем поместить этот подзапрос в ваш оператор select для получения необходимых полей.
SELECT (sq_fieldnamelist2)
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
Вам нужно отредактировать LIMIT 3,100 в sq_fieldnamelist2 для вашей собственной цели.
скажем, что ваша таблица подобна fil1, fil2... filN, sal1, sal2, sal3...., salI, чтобы увидеть только поля зарплаты, которые вы должны использовать LIMIT N,x>I+N
. если вы хотите, чтобы все использовали LIMIT 0,x>N+I
Ответ 3
Я не вижу, почему вы не можете сделать
SELECT *
FROM addstock25
INTO OUTFILE "E:\\JOSE DATA\\addstock7.csv"
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n
?
Ответ 4
Я думаю, вы ищете что-то вроде этого.
SET @sql = NULL;
SELECT GROUP_CONCAT("'",COLUMN_NAME,"'")
FROM
(SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'yourdatabasename'
and `TABLE_NAME`='ffd_companies'
) AS colnames
GROUP BY 'COLUMN_NAME'
into @sql;
SET @sql = concat ("SELECT", @sql, " from dual
UNION ALL
SELECT *
FROM addstock25
INTO OUTFILE 'E:\\JOSE DATA\\addstock7.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '", '"',"'
)"
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Надеюсь, это поможет вам.
Примечание: я добавляю предложение WHERE TABLE_SCHEMA
= 'yourdatabasename'