使用SELECT INTO OUTFILE时包含标题?

Bre*_*ett 104 mysql into-outfile

使用MySQL时是否可能以某种方式包含标题INTO OUTFILE

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)

  • 但是如果`SELECT`子句中有`ORDER BY`,它将无法工作.标题行可以是生成的文件中的任何位置,具体取决于顺序. (11认同)
  • 这是我考虑切换到另一个 DBMS 的原因之一。 (2认同)

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方法中的第一个语句.

  • 这将返回在单个字段中连接在一起的所有列。我无法将它与另一个返回多个字段的 select 语句结合起来。不过,这对于获取一行我可以复制并粘贴为我的输出文件的标题非常有用。 (2认同)
  • 这个想法是复制生成的单个字段并将其粘贴到您的 UNION 语句中,而不是在使用 Joe 的方法(接受的答案)时手动输入 column1、column2 等,以便您可以更快地获得列列表! (2认同)

小智 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 来重新创建表,则需要删除该列。


Don*_*ner 5

这将使您有订购的列和/或限制

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)


rah*_*kla 5

在NodeJS中的大表上执行mysql查询时,我遇到了类似的问题。我遵循的在CSV文件中包含标头的方法如下

  1. 使用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)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用prepend-file npm软件包将列标题附加到在步骤1中创建的文件中

每个步骤的执行都使用NodeJS中的promises进行控制。