143 votes

Inclure les en-têtes lors de l'utilisation de SELECT INTO OUTFILE ?

Est-il possible d'inclure les en-têtes d'une manière ou d'une autre lors de l'utilisation de l'application MySQL INTO OUTFILE ?

195voto

Joe Stefanelli Points 72874

Vous devrez coder ces en-têtes vous-même. Quelque chose comme :

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'

22 votes

Mais cela ne fonctionnera pas s'il y a un ORDER BY dans le SELECT clause. La ligne d'en-tête peut se trouver n'importe où dans le fichier généré, selon l'ordre.

0 votes

Voir quelques réponses ci-dessous pour des idées sur l'utilisation de ORDER BY et aussi la réponse de matt pour un moyen d'obtenir rapidement tous les ColName1, ColName2, etc. Des compléments très utiles à cette excellente réponse !

1 votes

Cette réponse semble correcte, je l'ai même utilisée presque aveuglément sur mon serveur de développement... Sans les en-têtes de colonnes, il faut environ 50 secondes pour vider 240 millions de lignes. Avec ce UNION ALL, le serveur a de gros problèmes en essayant de faire une table temporaire avant de tout vider, cela fait plus de 10 minutes maintenant et il attend toujours que la table temporaire soit écrite sur le disque ! Faites attention à cela ! Vous préférez certainement ajouter les noms des colonnes d'une autre manière, même si cela signifie ouvrir le fichier après avec un autre langage de programmation.

93voto

lucek Points 1380

La solution fournie par Joe Steanelli fonctionne, mais l'établissement d'une liste de colonnes est peu pratique lorsque des dizaines ou des centaines de colonnes sont concernées. Voici comment obtenir la liste des colonnes d'une table ma_table sur mon_schéma .

-- 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

Maintenant vous pouvez copier et coller la ligne résultante comme première déclaration dans la méthode de Joe.

3 votes

Cela renvoie toutes les colonnes concaténées dans un seul champ. Je ne parviens pas à le faire avec une autre instruction select qui renvoie plusieurs champs. C'est pourtant très utile pour obtenir une ligne que je peux copier et coller comme en-tête de mon fichier de sortie.

2 votes

L'idée est de copier le champ unique résultant et de le coller dans votre instruction UNION au lieu de taper manuellement column1, column2, etc. en utilisant la méthode de Joe (la réponse acceptée) afin d'obtenir la liste des colonnes plus rapidement !

0 votes

Je cherchais à exporter le schéma de toutes mes tables/champs. Cette réponse combinée à celle acceptée a fait l'affaire !

16voto

evilguc Points 105

Pour une sélection complexe avec ORDER BY, j'utilise ce qui suit :

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';

0 votes

Cette solution fonctionne bien lorsque l'on ordonne la deuxième requête (complexe) ; si vous ne le faites pas de cette façon, vous finirez par ordonner la première colonne également, ce qui n'est pas souhaitable. Bonne suggestion @evilguc !

1 votes

Cela n'a pas fonctionné avec moi, après avoir fait UNION ALL l'ordre de la colonne id est désordonné.

9voto

Vrag Points 21

Vous pouvez utiliser l'instruction préparée avec la réponse de lucek et exporter dynamiquement le tableau avec le nom des colonnes en 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;

Merci lucek.

2voto

Paul W Points 824

Je pense que si vous utilisez un UNION, cela fonctionnera :

select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...

Je ne connais pas de moyen de spécifier directement les en-têtes avec la syntaxe INTO OUTFILE.

1 votes

UNION TOUTES serait plus sûr et plus rapide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X