Joe*_*lli 147
您必须自己对这些标题进行硬编码.就像是:
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
FROM YourTable
INTO OUTFILE '/path/outfile'
Run Code Online (Sandbox Code Playgroud)
mat*_*att 77
Joe Steanelli提供的解决方案很有效,但是当涉及数十或数百列时,列表列表会很不方便.以下是如何在my_schema中获取表my_table的列列表.
-- 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
Run Code Online (Sandbox Code Playgroud)
现在,您可以将生成的行复制并粘贴为Joe方法中的第一个语句.
小智 13
对于使用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';
Run Code Online (Sandbox Code Playgroud)
小智 6
我只是进行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
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用带有lucek的答案的预准备语句,并使用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;
Run Code Online (Sandbox Code Playgroud)
谢谢lucek.
小智 5
如果您熟悉 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')
Run Code Online (Sandbox Code Playgroud)
这有点作弊,但我发现当我的列数太长而无法使用上面的 concat 方法时,这是一个快速的解决方法。注意:R 会在 CSV 的开头添加一个“row.names”列,因此如果您确实需要依赖 CSV 来重新创建表,则需要删除该列。
这将使您有订购的列和/或限制
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
FROM YourTable order by ColName1 limit 3) a
INTO OUTFILE '/path/outfile';
Run Code Online (Sandbox Code Playgroud)
在NodeJS中的大表上执行mysql查询时,我遇到了类似的问题。我遵循的在CSV文件中包含标头的方法如下
使用OUTFILE查询准备没有标题的文件
SELECT * INTO OUTFILE [FILE_NAME] FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED
BY '\"' LINES TERMINATED BY '\n' FROM [TABLE_NAME]
Run Code Online (Sandbox Code Playgroud)获取第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
Run Code Online (Sandbox Code Playgroud)使用prepend-file npm软件包将列标题附加到在步骤1中创建的文件中
每个步骤的执行都使用NodeJS中的promises进行控制。