हेडर का चयन करते समय शामिल करें?


117

क्या MySQL का उपयोग करते समय हेडर को किसी तरह शामिल करना संभव है INTO OUTFILE ?

जवाबों:


166

आपको उन हेडर को स्वयं कोड करना होगा। कुछ इस तरह:

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

14
लेकिन यह अगर खंड ORDER BYमें है तो काम नहीं करेगा SELECT। हेडर लाइन आदेश के आधार पर उत्पन्न फ़ाइल में कहीं भी हो सकती है।
कुंडली

ORDER BY का उपयोग करने के बारे में विचारों के लिए नीचे दिए गए कुछ उत्तर और मैट के उत्तर को भी जल्दी से सभी ColName1, ColName2, आदि को प्राप्त करने के लिए बहुत ही उपयोगी ऐड-ऑन इस महान उत्तर के लिए देखें!
एंड्रयू टी

1
यह उत्तर सही के बारे में लगता है, नरक मैं भी इसे लगभग अपने देव सर्वर पर आँख बंद करके इस्तेमाल करता था ... स्तंभ हेडर के बिना, 240 मिलियन लाइनों को डंप करने में लगभग 50 सेकंड लगते हैं। इस यूनिअन ऑल के साथ, सर्वर बड़ी परेशानियों में पड़ रहा है, सब कुछ डंप करने से पहले एक अस्थायी तालिका बनाने की कोशिश कर रहा है, यह अब 10 मिनट से अधिक हो गया है और अभी भी डिस्क पर लिखे जाने के लिए अस्थायी तालिका की प्रतीक्षा कर रहा है! उस के बारे में पता होना! आप निश्चित रूप से कॉलम के नामों को किसी अन्य तरीके से जोड़ना पसंद करेंगे, भले ही इसका मतलब है कि किसी अन्य प्रोग्रामिंग भाषा के साथ फ़ाइल खोलने के बाद।
साल्केटर

यह केवल तभी काम करता प्रतीत होता है जब YourTable के सभी कॉलम एक कैरेक्टर डेटा टाइप होते हैं, जो इसका अर्थ है। अन्यथा आपको अनचाही त्रुटि मिलती है: "उपयोग किए गए चयनित विवरणों में कॉलम की एक अलग संख्या होती है"।
बामफ

1
यह एक कारण है कि मैं दूसरे DBMS पर स्विच करने पर विचार कर रहा हूं।
e18r

85

जो स्टीनली ​​द्वारा प्रदान किया गया समाधान काम करता है, लेकिन दर्जनों या सैकड़ों कॉलम शामिल होने पर स्तंभों की सूची बनाना असुविधाजनक है। यहाँ कैसे तालिका के स्तंभ सूची प्राप्त करने का 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

अब आप जो की विधि में पहले बयान के रूप में परिणामी पंक्ति को कॉपी और पेस्ट कर सकते हैं।


2
यह एक ही क्षेत्र में एक साथ एकत्रित सभी कॉलम लौटाता है। मैं एक और चुनिंदा कथन के साथ कई क्षेत्रों में रिटर्न करने में असमर्थ हूं। यह वास्तव में एक लाइन पाने के लिए उपयोगी है जिसे मैं अपने संगठन के शीर्षलेख के रूप में कॉपी और पेस्ट कर सकता हूं, हालांकि।
tmoore82

1
विचार यह है कि परिणामी एकल फ़ील्ड को कॉपी करें और अपने UNION स्टेटमेंट में कॉलम 1, कॉलम 2 इत्यादि को मैन्युअल रूप से टाइप करने के बजाय जो के तरीके (स्वीकृत उत्तर) का उपयोग करें, ताकि आप कॉलम की सूची जल्दी प्राप्त कर सकें!
एंड्रयू टी

मैं अपनी सभी तालिका / फ़ील्ड स्कीमा निर्यात करना चाह रहा था। इस जवाब के साथ संयुक्त स्वीकार किया एक चाल है!
रेमी ब्रेटन

@ क्रिस ORDER BY ORDINAL_POSITIONसंभालती है कि
मैट

1
ORDINAL_POSITION द्वारा ORDER GROUP_CONCAT () कॉल का हिस्सा होना चाहिए, जैसा किGROUP_CONCAT(CONCAT('"',COLUMN_NAME,'"') order BY ORDINAL_POSITION)
Apuleius

15

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

दूसरी (जटिल) क्वेरी का आदेश देते समय यह समाधान अच्छी तरह से काम करता है; यदि आप इसे इस तरह नहीं करते हैं तो आप पहले कॉलम को भी समाप्त करने का आदेश देंगे जो अवांछनीय है। अच्छा सुझाव @evilguc!
एरॉन

मेरे साथ काम नहीं किया, UNION करने के बाद id कॉलम का सारा क्रम गड़बड़ हो गया है
मोहनद कालिया

6

आप तैयार स्टेटमेंट का उपयोग कर सकते हैं और 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;

धन्यवाद lucek।


6

यह आपको कॉलम और / या एक सीमा के लिए आदेश देगा

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
    FROM YourTable order by ColName1 limit 3) a
    INTO OUTFILE '/path/outfile';

1
बस ध्यान दें कि इस क्वेरी लेआउट ने मेरे लिए MariaDB 10.1 में भी काम किया था; इस सूत्र में सुझाए गए अन्य लेआउट नहीं थे।
प्रोग्रामरडान

शीर्ष लेख को किसी कारणवश नीचे ले आता है, लेकिन यह ठीक काम करता है कि एक स्प्रेडशीट ऐप में शीर्ष पर वापस, अजीब लेकिन चीयर्स
दिमित्री डीबी

मैं भी mariaDB का उपयोग कर रहा हूँ। सिर्फ 100 लीड की निकासी के साथ, यह स्वीकृत उत्तर को चलाने की तुलना में 14 सेकंड से अधिक तेजी से था। पहले पास के साथ स्वीकार किया गया: Query OK, 100 rows affected (14.72 sec) दूसरा पास आपके साथQuery OK, 101 rows affected (0.00 sec)
कैस्पर विल्कस

6

मैं केवल 2 प्रश्न बनाता हूं, पहले कॉलम नामों के साथ क्वेरी आउटपुट (सीमा 1) प्राप्त करने के लिए (कोई हार्डकोड नहीं, जोड़ों के साथ कोई समस्या नहीं, ऑर्डर कॉलम कस्टम नाम आदि), और दूसरा खुद क्वेरी बनाने के लिए, और एक सीएसवी में फ़ाइलों को संयोजित करें। फ़ाइल:

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

NodeJS में बड़े तालिकाओं पर mysql क्वेरी निष्पादित करते समय मुझे इसी तरह की समस्या का सामना करना पड़ा। मेरे 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 में बनाई गई फ़ाइल में जोड़ें

प्रत्येक चरण का निष्पादन NodeJS में वादों का उपयोग करके नियंत्रित किया गया था।


3

यह एक वैकल्पिक धोखा है यदि आप पायथन या आर से परिचित हैं, और आपकी तालिका स्मृति में फिट हो सकती है।

पायथन या आर में एसक्यूएल टेबल आयात करें और फिर वहां से एक सीएसवी के रूप में निर्यात करें और आपको कॉलम के नाम और साथ ही डेटा मिलेगा।

यहाँ मैं आर का उपयोग कैसे करूँ, इसके लिए 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')

यह एक धोखा है, लेकिन मैंने पाया कि यह एक त्वरित बदलाव था जब मेरे कॉम्बैट के ऊपर कॉलम विधि का उपयोग करने के लिए बहुत लंबा था। नोट: R, CSV की शुरुआत में एक 'row.names' कॉलम जोड़ेगा ताकि आप यह चाहते हैं कि यदि आपको तालिका को फिर से बनाने के लिए CSV पर निर्भर रहने की आवश्यकता हो।


2

इसलिए, यदि सभी कॉलम my_tableएक वर्ण डेटा प्रकार हैं , तो हम शीर्ष उत्तरों को एक साथ जोड़ सकते हैं, जो हेडर, एक 'सरल' एसक्यूएल क्वेरी, जैसे स्वचालित रूप से जोड़े जाने के लिए, एक साथ जोड़ सकते हैं।

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

जहां अंतिम दो पंक्तियां आउटपुट सीएसवी बनाती हैं।

ध्यान दें कि यह my_tableबहुत बड़ा होने पर धीमा हो सकता है।


इसमें "उपयोग किए गए सेलेक्ट स्टेटमेंट में कॉलम की एक अलग संख्या है" त्रुटि है। सर
बोवाई लियू

1

मुझे लगता है कि यदि आप एक संघ का उपयोग करते हैं तो यह काम करेगा:

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

मुझे सीधे OUTFILE सिंटैक्स के साथ शीर्ष लेख निर्दिष्ट करने के तरीके का पता नहीं है।


1
यूनिअन सभी सुरक्षित और तेज़ होगा।
टॉक्सालॉट

1

वास्तव में आप इसे ORDER BY के साथ भी काम कर सकते हैं।

बस बयान के क्रम में कुछ प्रवंचना की जरूरत है - हम एक केस स्टेटमेंट का उपयोग करते हैं और हेडर मान को कुछ अन्य मान के साथ प्रतिस्थापित करते हैं जो सूची में पहले क्रमबद्ध करने की गारंटी है (जाहिर है यह क्षेत्र के प्रकार पर निर्भर है और आप एएससी को छांट रहे हैं या नहीं DESC)

मान लें कि आपके पास तीन फ़ील्ड हैं, नाम (varchar), is_active (bool), date_something_happens (दिनांक), और आप दूसरा दो अवरोही क्रमबद्ध करना चाहते हैं:

select 
        'name'
      , 'is_active' as is_active
      , date_something_happens as 'date_something_happens'

 union all

 select name, is_active, date_something_happens

 from
    my_table

 order by
     (case is_active when 'is_active' then 0 else is_active end) desc
   , (case date when 'date' then '9999-12-30' else date end) desc

1

चूंकि 'शामिल-हेडर्स' की कार्यक्षमता अभी तक बिल्ड-इन नहीं लगती है, और यहां अधिकांश "समाधान" को कॉलम नामों को मैन्युअल रूप से टाइप करने की आवश्यकता है, और / या यहां तक ​​कि खाते में जुड़ने की आवश्यकता नहीं है, मैं इसकी सिफारिश करना चाहता हूं। समस्या के आसपास जाओ

  • अब तक मुझे मिला सबसे अच्छा विकल्प एक सभ्य उपकरण (मैं HeidiSQL का उपयोग करता हूं ) का उपयोग कर रहा हूं ।
    अपना अनुरोध रखें, ग्रिड का चयन करें, बस एक फ़ाइल पर राइट क्लिक करें और निर्यात करें। यह एक साफ निर्यात के लिए सभी आवश्यक विकल्प मिला, ans को अधिकांश आवश्यकताओं को संभालना चाहिए।

  • एक ही विचार में, user3037511 का दृष्टिकोण ठीक काम करता है, और इसे आसानी से स्वचालित किया जा सकता है ।
    बस कुछ कमांड लाइन के साथ अपना अनुरोध लॉन्च करेंअपने हेडर प्राप्त करने के लिए । आपको डेटा को सेलेक्ट इन्टू ओटमीर के साथ मिल सकता है ... या सीमा के बिना अपनी क्वेरी चलाकर, आपका चयन करने के लिए।

    ध्यान दें कि फ़ाइल में आउटपुट रीडायरेक्ट लिनक्स और विंडोज दोनों पर एक आकर्षण की तरह काम करता है।


यह मुझे उस समय के 80% को उजागर करना चाहता है , जब मैं SELECT FROM INFILE या SELECT INTO OUTFILE का उपयोग करना चाहता हूं, मैं कुछ और उपयोग कर रहा हूं। कुछ सीमाओं (यहाँ, 'हेडर ऑप्शन्स' की अनुपस्थिति के कारण, ) एडब्ल्यूएस-आरडीएस, लापता अधिकार और इसी तरह।)

इसलिए, मैं ऑप के सवाल का बिल्कुल जवाब नहीं देता ... लेकिन यह उसकी जरूरतों का जवाब देना चाहिए :)
EDIT: और वास्तव में उसके सवाल का जवाब देने के लिए: नहीं
2017-09-07 तक, आप सिर्फ हेडर शामिल नहीं कर सकते हैं यदि आप Select INTO OUTFILE कमांड के साथ रहना
: |


1

कोलम (आईडी, समय, यूनिट) के साथ मेरे डेटाबेस टेबल नेम सेंसर का एक उदाहरण

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

0

मैं PHP में अपना कोड लिख रहा था, और मुझे कॉनकैट और यूनियन फ़ंक्शंस का उपयोग करने में थोड़ी परेशानी हो रही थी, और SQL चर का भी उपयोग नहीं किया था, किसी भी तरह से मुझे यह काम करने के लिए मिला, यहां मेरा कोड है:

//first I connected to the information_scheme DB

$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");

//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)

    $headers = '';
    $sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'";
    $result = $headercon->query($sql);
    while($row = $result->fetch_row())
    {
        $headers = $headers . "'" . $row[0] . "', ";
    }
$headers = substr("$headers", 0, -2);

// connect to the DB of interest

$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");

// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','";
$result4 = $con->query($sql4);

0

यहां कॉलम नामों से हेडर शीर्षक को गतिशील रूप से प्राप्त करने का एक तरीका है।

/* Change table_name and database_name */
SET @table_name = 'table_name';
SET @table_schema = 'database_name';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);

/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;

SET @col_names = (
  SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
  FROM information_schema.columns
  WHERE table_schema = @table_schema
  AND table_name = @table_name);

SET @cols = CONCAT('(SELECT ', @col_names, ')');

SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name,
  ' INTO OUTFILE \'/tmp/your_csv_file.csv\'
  FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\'
  LINES TERMINATED BY \'\n\')');

/* Concatenates column names to query */
SET @sql = CONCAT(@cols, ' UNION ALL ', @query);

/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

1
काफी कुछ कहना चाहिए। इसे मेरे उद्देश्यों के लिए अपनाया। धन्यवाद!
डेनिस कुलगिन

0

मैं संगम बेलोज द्वारा प्रदान किए गए उत्तर में जोड़ना चाहूंगा। यहाँ उसका कोड है:

select ('id') as id, ('time') as time, ('unit') as unit
UNION ALL
SELECT * INTO OUTFILE 'C:/Users/User/Downloads/data.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM sensor

हालाँकि, यदि आपने "secure_file_priv"चर के भीतर अपना सेटअप नहीं किया है , तो यह काम नहीं कर सकता है। उसके लिए, उस चर पर सेट फ़ोल्डर की जाँच करें:

SHOW VARIABLES LIKE "secure_file_priv"

आउटपुट इस तरह दिखना चाहिए:

mysql> show variables like "%secure_file_priv%";
+------------------+------------------------------------------------+
| Variable_name    | Value                                          |
+------------------+------------------------------------------------+
| secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
+------------------+------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

आप या तो इस चर को बदल सकते हैं या फ़ाइल को डिफ़ॉल्ट पथ पर प्रदर्शित करने के लिए क्वेरी को बदल सकते हैं।


0

MySQL अकेले ऐसा करने के लिए पर्याप्त नहीं है। नीचे एक PHP स्क्रिप्ट है जो कॉलम और डेटा को CSV में आउटपुट करेगा।

शीर्ष के पास अपना डेटाबेस नाम और तालिकाएँ दर्ज करें।

<?php

set_time_limit( 24192000 );
ini_set( 'memory_limit', '-1' );
setlocale( LC_CTYPE, 'en_US.UTF-8' );
mb_regex_encoding( 'UTF-8' );

$dbn = 'DB_NAME';
$tbls = array(
'TABLE1',
'TABLE2',
'TABLE3'
);

$db = new PDO( 'mysql:host=localhost;dbname=' . $dbn . ';charset=UTF8', 'root', 'pass' );

foreach( $tbls as $tbl )
{
    echo $tbl . "\n";
    $path = '/var/lib/mysql/' . $tbl . '.csv';

    $colStr = '';
    $cols = $db->query( 'SELECT COLUMN_NAME AS `column` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "' . $tbl . '" AND TABLE_SCHEMA = "' . $dbn . '"' )->fetchAll( PDO::FETCH_COLUMN );
    foreach( $cols as $col )
    {
        if( $colStr ) $colStr .= ', ';
        $colStr .= '"' . $col . '"';
    }

    $db->query(
    'SELECT *
    FROM
    (
        SELECT ' . $colStr . '
        UNION ALL
        SELECT * FROM ' . $tbl . '
    ) AS sub
    INTO OUTFILE "' . $path . '"
    FIELDS TERMINATED BY ","
    ENCLOSED BY "\""
    LINES TERMINATED BY "\n"'
    );

    exec( 'gzip ' . $path );

    print_r( $db->errorInfo() );
}

?>

आपको वह निर्देशिका बनाने की आवश्यकता होगी जिसे आप आउटपुट करना चाहते हैं। MySQL को डायरेक्टरी में लिखने की क्षमता होनी चाहिए।

$path = '/var/lib/mysql/' . $tbl . '.csv';

आप क्वेरी में CSV निर्यात विकल्प संपादित कर सकते हैं:

INTO OUTFILE "' . $path . '"
FIELDS TERMINATED BY ","
ENCLOSED BY "\""
LINES TERMINATED BY "\n"'

अंत में CSV को GZip करने के लिए एक निष्पादन कॉल है।


-1
'ColName1', 'ColName2', 'ColName3' का चयन करें
यूनिअन ऑल
ColName1, ColName2, ColName3 का चयन करें
    आपकी ओर से
    OUTFILE के c: \\ datasheet.csv 'FIELDS TERMINATED BY', 'OPTICALALLY ENCLOSED BY' '' LINES TERMINATED BY '\ n' 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.