MySQL में मौजूदा रो के लिए इंसर्ट स्टेटमेंट प्राप्त करें


139

MySQL का उपयोग करके मैं क्वेरी चला सकता हूं:

SHOW CREATE TABLE MyTable;

और यह विशिष्ट तालिका के लिए तालिका तालिका विवरण लौटाएगा। यह उपयोगी है यदि आपके पास पहले से बनाई गई एक तालिका है, और उसी तालिका को किसी अन्य डेटाबेस पर बनाना चाहते हैं।

क्या पहले से मौजूद पंक्ति, या पंक्तियों के सेट के लिए सम्मिलित विवरण प्राप्त करना संभव है? कुछ तालिकाओं में कई कॉलम हैं, और मेरे लिए यह अच्छा होगा कि मैं सम्मिलित विवरण लिखने के बिना किसी अन्य डेटाबेस पर पंक्तियों को स्थानांतरित करने के लिए एक सम्मिलित विवरण प्राप्त करने में सक्षम हो, या CSV को डेटा निर्यात किए बिना और फिर उसी डेटा को आयात करूं दूसरे डेटाबेस में।

बस स्पष्ट करने के लिए, मुझे क्या चाहिए कुछ ऐसा है जो निम्नानुसार काम करेगा:

SHOW INSERT Select * FROM MyTable WHERE ID = 10;

और मेरे लिए निम्न वापसी की है:

INSERT INTO MyTable(ID,Col1,Col2,Col3) VALUES (10,'hello world','some value','2010-10-20');

DB से कनेक्ट करने के लिए आप किस टूल का उपयोग करते हैं? कुछ कार्यक्रम ऐसे टेम्पलेट प्रदान करते हैं।
14

2
@kibbee, क्या आपने इसके लिए कोई समाधान पाया है ??
हसीना

2
उस उत्तर को पसंद करेंगे, जिसने mysql>शीघ्र से INSERT बयान दिखाए । अब तक कोई नहीं करता।
बॉब स्टीन

क्या आपने इसके लिए कोई समाधान ढूंढा है, प्रोग्राम स्टेटमेंट डालने के लिए?
वैभव जैन

जवाबों:


155

INSERTMySQL कंसोल से स्टेटमेंट प्राप्त करने का कोई तरीका प्रतीत नहीं होता है , लेकिन आप रोब का सुझाव दिया जैसे mysqldump का उपयोग करके प्राप्त कर सकते हैं । -tतालिका निर्माण को छोड़ना निर्दिष्ट करें ।

mysqldump -t -u MyUserName -pMyPassword MyDatabase MyTable --where="ID = 10"

इसे देखें यदि आपको त्रुटि मिलती है mysqldump: 'SELECT @@ GTID_MODE' निष्पादित नहीं कर सका: अज्ञात सिस्टम वैरिएबल 'GTID_MODE' (1193) gist.github.com/arun057-5556563
डैनियल

10
और यदि आप सम्मिलित विवरण के साथ फ़ील्ड / कॉलम नाम चाहते हैं तो आप "
अपूर्ण


और --hex-blobयदि आपके पास कॉलम कॉलम (उदाहरण के लिए bit(1)) है, तो वह इसे स्ट्रिंग के रूप में लिखेगा, जिसके परिणामस्वरूप Unknown command '\0'INSERT निष्पादित करते समय त्रुटि हो सकती है ।
moffeltje

79

MySQL वर्कबेंच में आप किसी एकल-तालिका क्वेरी के परिणामों को INSERTबयानों की सूची के रूप में निर्यात कर सकते हैं । बस क्वेरी चलाएँ, और फिर:

निर्यात बटन का स्नैपशॉट

  1. Export/Importपरिणामों के ऊपर फ्लॉपी डिस्क पर क्लिक करें
  2. लक्ष्य फ़ाइल को एक नाम दें
  3. विंडो के निचले भाग में, Formatचयन के लिएSQL INSERT statements
  4. क्लिक Save
  5. क्लिक Export

2
इसके अलावा, दाईं ओर का आइकन आपके द्वारा बनाए गए निर्यात को आयात करने के लिए बहुत आसान है। बहुत अच्छी सुविधा। एकमात्र मुश्किल हिस्सा यह है कि आप केवल एक चयन के बाद परिणाम सेट पैनल से आइकन तक पहुंच सकते हैं।
हाफ_डुप्लेक्स

13

चूंकि आपने SHOW CREATE TABLE MyTable द्वारा निर्मित SQL के साथ तालिका की प्रतिलिपि बनाई है , आप डेटा को नई तालिका में लोड करने के लिए बस निम्नलिखित कर सकते हैं।

INSERT INTO dest_db.dest_table SELECT * FROM source_db.source_table;

यदि आप वास्तव में INSERT स्टेटमेंट चाहते हैं, तो एकमात्र तरीका जो मुझे पता है, वह है mysqldump http://dev.mysql.com/doc/refman/5.1/en/mysqldump.htm । आप इसे केवल एक विशिष्ट तालिका के लिए डेटा डंप करने और यहां तक ​​कि पंक्तियों को सीमित करने के लिए विकल्प दे सकते हैं।


विचाराधीन डेटाबेस अलग-अलग नेटवर्क पर, विभिन्न नेटवर्क पर मौजूद हैं, इसलिए यह विधि मेरे लिए काम नहीं करेगी, लेकिन MySQL के समान उदाहरण पर चलने वाले डेटाबेस के लिए ठीक काम करती है
Kibbee

क्या आप प्रोग्राम को मशीनों के बीच डेटा के सबसेट ले जाने की कोशिश कर रहे हैं? क्या आप डेटा को मिरर करने के लिए दूसरी मशीन को गुलाम नहीं बना सकते हैं, तो अपने सबसेट को डेटाबेस में डेटाबेस के बीच ले जाएं?
रोब प्राउज़

1
आइए, तर्क के लिए कहें कि मेरे पास एक तालिका है जिसमें टाइम ज़ोन है। अब, किसी कारण से एक नया समय क्षेत्र बनाया जाता है (शायद 15 मिनट ऑफसेट या ऐसा कुछ)। इसलिए मैं विकास डेटाबेस में नई पंक्ति जोड़ता हूं जिसमें नए समयक्षेत्र के बारे में सभी जानकारी होती है और सभी आवश्यक परीक्षण करते हैं। जब उस टाइमज़ोन जानकारी को उत्पादन डेटाबेस में ले जाने का समय आता है तो मुझे स्क्रैच से इंसर्ट स्टेटमेंट बनाना पड़ता है, या एक्सपोर्ट / इम्पोर्ट करना पड़ता है। अच्छा होगा कि आप सिर्फ इंसर्ट कर सकें, और फिर इसे नए टाइमज़ोन लाइव लाने के लिए स्क्रिप्ट में शामिल करें।
किबी

1
मेरे पास मूल इंसर्ट नहीं है क्योंकि हो सकता है कि मैंने इसे GUI टूल का उपयोग करके डाला हो, या मुझे अपने द्वारा डाले गए मूल मानों से इसे 3 बार बदलना पड़ सकता है।
किबी

1
मुझे उसी मशीन पर डेटाबेस के लिए एक सरल समाधान की आवश्यकता हुई और Google मुझे यहां लाया। इसलिए मैं इस उत्तर के लिए आभारी हूं, भले ही यह मूल प्रश्न के संदर्भ से बाहर हो गया हो :)
जेसन मैककारेल

10

मैंने एक php फ़ंक्शन लिखा है जो ऐसा करेगा। इतिहास तालिका के लिए विलोपन के बाद रिकॉर्ड की आवश्यकता के मामले में मुझे एक सम्मिलित विवरण बनाने की आवश्यकता है:

function makeRecoverySQL($table, $id)
{
    // get the record          
    $selectSQL = "SELECT * FROM `" . $table . "` WHERE `id` = " . $id . ';';

    $result = mysql_query($selectSQL, $YourDbHandle);
    $row = mysql_fetch_assoc($result); 

    $insertSQL = "INSERT INTO `" . $table . "` SET ";
    foreach ($row as $field => $value) {
        $insertSQL .= " `" . $field . "` = '" . $value . "', ";
    }
    $insertSQL = trim($insertSQL, ", ");

    return $insertSQL;
}

3
यह घोल काफी नाजुक है। उदाहरण के लिए, यदि आपके किसी रिकॉर्ड में नाम शामिल है O' Malley, तो उत्पन्न किए गए प्रश्नों में एकल-उद्धरणों को मिसमैच करने के कारण सिंटैक्स त्रुटियां होंगी। mysql_real_escape_stringइस मार्ग पर जाने पर आपको कम से कम उपयोग करना चाहिए ।
एरिक सस्टैंडैंड

अभी भी अच्छा सामान, मैं इसे सुनिश्चित करने के लिए उपयोग
करूंगा

9

लैपटॉप लिफ्ट का कोड ठीक काम करता है, लेकिन कुछ चीजें थीं जो मुझे लगा कि लोग पसंद कर सकते हैं।

डेटाबेस हैंडलर एक तर्क है, हार्डकोड नहीं है। नए mysql एपीआई का इस्तेमाल किया। वैकल्पिक के साथ $ id को बदल दिया गया है जहाँ लचीलेपन के लिए तर्क दिया गया है। अगर किसी ने कभी भी एसक्यूएल इंजेक्शन करने की कोशिश की है और उद्धरणों को शामिल करने वाले सरल टूटने से बचने की कोशिश की है, तो real_escape_string का उपयोग करें। INSERT table (field...) VALUES (value...)...वाक्यविन्यास का उपयोग किया जाता है ताकि फ़ील्ड केवल एक बार परिभाषित हो और फिर प्रत्येक पंक्ति के मानों को सूचीबद्ध करें (प्रत्यारोपण भयानक है)। क्योंकि निगेल जॉनसन ने इसे इंगित किया, मैंने NULLहैंडलिंग को जोड़ा ।

मैंने इस्तेमाल किया $array[$key]क्योंकि मुझे चिंता थी कि यह किसी तरह से बदल सकता है, लेकिन जब तक कुछ बुरी तरह से गलत नहीं होता, तब तक यह वैसे भी नहीं होना चाहिए।

<?php
function show_inserts($mysqli,$table, $where=null) {
    $sql="SELECT * FROM `{$table}`".(is_null($where) ? "" : " WHERE ".$where).";";
    $result=$mysqli->query($sql);

    $fields=array();
    foreach ($result->fetch_fields() as $key=>$value) {
        $fields[$key]="`{$value->name}`";
    }

    $values=array();
    while ($row=$result->fetch_row()) {
        $temp=array();
        foreach ($row as $key=>$value) {
            $temp[$key]=($value===null ? 'NULL' : "'".$mysqli->real_escape_string($value)."'");
        }
        $values[]="(".implode(",",$temp).")";
    }
    $num=$result->num_rows;
    return "INSERT `{$table}` (".implode(",",$fields).") VALUES \n".implode(",\n",$values).";";
}
?>

सुनिश्चित नहीं हैं कि के बारे में लापता INTOपर INSERT INTO {$tables}लेकिन वहाँ तालिका में nulls का कोई उपयोग होता है।
निगेल जॉनसन

1
@NigelJohnson INTOपूरी तरह से वैकल्पिक है । मैंने इसमें नल की हैंडलिंग को जोड़ा।
चिनोटो वोक्रो

6

मैं प्रोग्राम SQLYOG का उपयोग करता हूं जहां मैं चयन क्वेरी बना सकता हूं, स्क्रीनशॉटपरिणामों पर इंगित कर सकता हूं और निर्यात को sql के रूप में चुन सकता हूं । यह मुझे सम्मिलित विवरण देता है।


बस भ्रम से बचने के लिए, यह sql प्रारूप कहता है, लेकिन यह वास्तव में mysql प्रारूप में निर्यात करता है।
कुमार विक्रमजीत

धन्यवाद .... +1 जैसा कि इसने मेरे लिए काम किया। लेकिन केवल चयनित पंक्तियों के लिए नहीं मिल सका। :( आपकी पद्धति तालिका की सभी पंक्तियों के लिए सम्मिलित क्वेरी दे रही है।
Mukit09

5

MySQL वर्क बेंच के भीतर निम्नलिखित कार्य करें:

  1. सर्वर> डेटा निर्यात पर क्लिक करें

  2. ऑब्जेक्ट चयन टैब में वांछित स्कीमा का चयन करें।

  3. अगला, स्कीमा के दाईं ओर सूची बॉक्स का उपयोग करके वांछित तालिकाओं का चयन करें।

  4. स्क्रिप्ट निर्यात करने के लिए फ़ाइल स्थान चुनें।

  5. समाप्त पर क्लिक करें।

  6. नई बनाई गई फ़ाइल पर नेविगेट करें और सम्मिलित विवरणों की प्रतिलिपि बनाएँ।


यह एक पूर्ण तालिका निर्यात, न कि किसी विशिष्ट पंक्तियों के निर्यात है
येहिया

4

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

SELECT 
    CONCAT(
        GROUP_CONCAT(
            CONCAT(
                'INSERT INTO `your_table` (`field_1`, `field_2`, `...`, `field_n`) VALUES ("',
                `field_1`,
                '", "',
                `field_2`,
                '", "',
                `...`,
                '", "',
                `field_n`,
                '")'
            ) SEPARATOR ';\n'
        ), ';'
    ) as `QUERY`
FROM `your_table`;

नतीजतन, आपके पास जोरदार बयान होगा:

INSERT INTO your_table( field_1, field_2, ..., field_n) मूल्यों (value_11, value_12, ..., value_1n);

INSERT INTO your_table( field_1, field_2, ..., field_n) मूल्यों (value_21, value_22, ..., value_2n);

/ ................................................. .... /

INSERT INTO your_table( field_1, field_2, ..., field_n) मूल्यों (value_m1, value_m2, ..., value_mn);

, जहाँ m_ आपके रिकॉर्ड में संख्या_है


4
क्या आप शायद अपने पेस्ट किए गए कोड ब्लॉक की तुलना में अपने उत्तर को थोड़ा और प्रदान कर सकते हैं?
मैट फ्लेचर

हाँ, लेकिन यह हार्डकोड है, फ़ील्ड_ * स्थिर नाम हैं। यह काम का आधा हिस्सा बनाता है, और यह इसे इतना अच्छा नहीं बनाता है
डेनियल क्रूसियानी

GROUP_CONCAT क्यों?
सीलब्रिज

3

आप ऐसा करने के लिए Sequel pro का उपयोग कर सकते हैं, प्राप्त परिणामों के लिए 'प्रविष्टि कथन के रूप में प्राप्त करने' का विकल्प है


3

PHPMyAdmin में आप कर सकते हैं:

  1. उस पंक्ति पर प्रतिलिपि पर क्लिक करें जिसे आप इसके सम्मिलित विवरण जानना चाहते हैं SQL:

कॉपी का चयन करें

  1. SQL का पूर्वावलोकन करें पर क्लिक करें:

पूर्वावलोकन का चयन करें

  1. आपको बनाया गया सम्मिलित विवरण मिलेगा जो इसे उत्पन्न करता है

आप एक बार में कई पंक्तियों पर आवेदन कर सकते हैं यदि आप उनका चयन करते हैं और तालिका के नीचे से कॉपी पर क्लिक करते हैं और फिर SQl का पूर्वावलोकन करते हैं


अपने उत्तर में अधिक स्पष्टीकरण और जानकारी जोड़ें
Ramin eghbalian

1

पीडीओ के साथ आप इसे इस तरह से कर सकते हैं।

$stmt = DB::getDB()->query("SELECT * FROM sometable", array());

$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
    $fields = array_keys($array[0]);

    $statement = "INSERT INTO user_profiles_copy (".implode(",",$fields).") VALUES ";
    $statement_values = null;

    foreach ($array as $key => $post) {
        if(isset($statement_values)) {
            $statement_values .= ", \n";
        }

        $values = array_values($post);
        foreach($values as $index => $value) {
            $quoted = str_replace("'","\'",str_replace('"','\"', $value));
            $values[$index] = (!isset($value) ? 'NULL' : "'" . $quoted."'") ;
        }

        $statement_values .= "(".implode(',',$values).")";


    }
    $statement .= $statement_values . ";";

    echo $statement;

1

आप नीचे दिए गए कोड के साथ SP बना सकते हैं - यह NULLS को भी सपोर्ट करता है।

select 'my_table_name' into @tableName;

/*find column names*/
select GROUP_CONCAT(column_name SEPARATOR ', ') from information_schema.COLUMNS
where table_schema =DATABASE()
and table_name = @tableName
group by table_name
into @columns
;

/*wrap with IFNULL*/
select replace(@columns,',',',IFNULL(') into @selectColumns;
select replace(@selectColumns,',IFNULL(',',\'~NULL~\'),IFNULL(') into @selectColumns;

select concat('IFNULL(',@selectColumns,',\'~NULL~\')') into @selectColumns;

/*RETRIEVE COLUMN DATA FIELDS BY PK*/
SELECT
  CONCAT(
    'SELECT CONCAT_WS(','''\'\',\'\''',' ,
    @selectColumns,
    ') AS all_columns FROM ',@tableName, ' where id = 5 into @values;'
    )
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;

/*Create Insert Statement*/
select CONCAT('insert into ',@tableName,' (' , @columns ,') values (\'',@values,'\')') into @prepared;

/*UNWRAP NULLS*/
select replace(@prepared,'\'~NULL~\'','NULL') as statement;

1

HeidiSQL उपयोगकर्ताओं के लिए :

यदि आप HeidiSQL का उपयोग करते हैं, तो आप सम्मिलित विवरण प्राप्त करने के लिए इच्छित पंक्ति का चयन कर सकते हैं। फिर राइट क्लिक करें> निर्यात करें पंक्तियाँ> "आउटपुट लक्ष्य" के लिए "कॉपी क्लिपबोर्ड पर कॉपी करें" का चयन करें, "पंक्ति चयन" के लिए "चयन" ताकि आप अन्य पंक्तियों, "SQL INSERTs" को "आउटपुट स्वरूप" के लिए निर्यात न करें> ठीक क्लिक करें।

यहां छवि विवरण दर्ज करें

इंसर्ट स्टेटमेंट आपके अंदर क्लिपबोर्ड पर होगा।


0

मुझे लगता है कि लैपटॉप लिफ्ट द्वारा प्रदान किया गया उत्तर सबसे अच्छा है ... लेकिन चूंकि किसी ने भी मेरे द्वारा उपयोग किए जाने वाले दृष्टिकोण का सुझाव नहीं दिया है, मुझे लगा कि मैं इसमें झंकार कर रहा हूं। मैं ज्यादातर समय अपने डेटाबेस को स्थापित करने और प्रबंधित करने के लिए phpMyAdmin का उपयोग करता हूं। इसमें, आप बस अपनी इच्छित पंक्तियों के आगे चेकमार्क लगा सकते हैं, और सबसे नीचे "निर्यात" पर क्लिक करें और SQL को चुना। यह आपके द्वारा चुने गए रिकॉर्ड्स के लिए आपको INSERT स्टेटमेंट देगा। उम्मीद है की यह मदद करेगा।


-1

आपकी टिप्पणियों के आधार पर, आपका लक्ष्य एक विकास पर्यावरण से उत्पादन वातावरण में डेटाबेस परिवर्तनों को स्थानांतरित करना है।

इसका सबसे अच्छा तरीका यह है कि आप अपने डेटाबेस के बदलावों को अपने सोर्स कोड में रखें और परिणामस्वरूप उन्हें अपने सोर्स कंट्रोल सिस्टम जैसे कि git / svn में ट्रैक करें।

आप इस तरह से कुछ के साथ जल्दी से उठ सकते हैं: https://github.com/davejkiger/mysql-php-migrations

PHP में एक बहुत ही बुनियादी कस्टम समाधान के रूप में, आप इस तरह से एक फ़ंक्शन का उपयोग कर सकते हैं:

function store_once($table, $unique_fields, $other_fields=array()) {
    $where = "";
    $values = array();
    foreach ($unique_fields as $k => $v) {
        if (!empty($where)) $where .= " && ";
        $where .= "$k=?";
        $values[] = $v;
    }
    $records = query("SELECT * FROM $table WHERE $where", $values);
    if (false == $records) {
        store($table, array_merge($unique_fields, $other_fields));
    }
}

फिर आप एक माइग्रेशन स्क्रिप्ट बना सकते हैं जो आपके विनिर्देशों के लिए किसी भी वातावरण को अपडेट करेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.