2009-08-30 14 views
66

मैं एक स्तंभ को छोड़ कर एक संरचना के साथ दो तालिकाओं है ... तालिका 2 कि अतिरिक्त स्तंभ जिसमें मैं CURRENT_DATE() सम्मिलित हैं हैMYSQL: दूसरी तालिका के साथ एक अतिरिक्त कॉलम रखने के साथ mysql में एक तालिका से दूसरी तालिका में एक पूरी पंक्ति की प्रतिलिपि कैसे करें?

मैं table2 को table1 से सभी मूल्यों को कॉपी करना चाहते हैं।

अगर मैं

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5; 

का उपयोग यह स्तंभों की संख्या में अंतर करने के लिए उनका कहना है एक त्रुटि फेंकता है।

  1. मैं इस के आसपास मिलता है:

    मैं उस पर दो प्रश्न हैं?

  2. और मैं इसी तारीख में तालिका 2 में अतिरिक्त दिनांक कॉलम (CURRENT_DATE()) के लिए मान कैसे जोड़ूं?
+0

आप इसे देख सकते थे। यह मेरे लिए mysql में काम किया। http://stackoverflow.com/questions/57168/how-to-copy-a-row-from-one-sql-server-table-to-another – Shreyo

उत्तर

79

जेड से जवाब को परिष्कृत करने के लिए, और अपनी टिप्पणी का जवाब देने में:

INSERT INTO dues_storage 
SELECT d.*, CURRENT_DATE() 
FROM dues d 
WHERE id = 5; 

टी.जे. देखें पाउडर की टिप्पणी

+43

** बहुत सावधान रहें ** ऐसा करना। यह काम करता है, लेकिन यह मानता है कि दो तालिकाओं में कॉलम का क्रम समान है; यह कॉलम नाम से ** ** ** मेल नहीं खाता है, और फिट करने के लिए मूल्यों को मजबूत करने का प्रयास करता है, जो अप्रत्याशित परिणाम उत्पन्न कर सकता है। अब, यदि आपकी विकास संरचना कॉलम ऑर्डर को अंतिम कॉल के समान बार मानती है, तो यह करने के लिए यह एक सुविधाजनक और सीधा तरीका है, लेकिन चेतावनी महत्वपूर्ण है। –

+0

सौभाग्य से आदेश वही है। भविष्य में भी संरचना को समान रखने के लिए बीमार रहें। सबको शुक्रीया! – user165242

+0

@crunchdog अगर मुझे 'एआईडी = बीआईडी'' कहां सेट करना है तो क्वेरी को व्यवस्थित कैसे किया जाना चाहिए? – Eugene

8
INSERT INTO dues_storage 
SELECT field1, field2, ..., fieldN, CURRENT_DATE() 
FROM dues 
WHERE id = 5; 
+0

तालिका में इतने सारे फ़ील्ड हैं, है कम रास्ता है? अगर मैं वहां टेबल संरचना बदलता हूं, तो मुझे php पृष्ठों को भी बदलना याद रखना होगा। – user165242

+0

आप इसे बकाया राशि से बच सकते हैं। * – Zed

44

ऐसा करने का सबसे सुरक्षित तरीका सम्मिलन और निष्कर्षण दोनों के लिए कॉलम को पूरी तरह से निर्दिष्ट करना है। इस बात की कोई गारंटी नहीं है (आवेदन के लिए) कि इनमें से कोई भी ऑर्डर होगा जो आपको लगता है कि वे हो सकते हैं।

insert into dues_storage (f1, f2, f3, cd) 
    select f1, f2, f3, current_date() from dues where id = 5; 

आप कई एकाधिक PHP पृष्ठों है कि ऐसा करने के (के रूप में आप एक और जवाब देने के लिए टिप्पणी में इंगित करने के लिए लग रहे हैं) को बदलने के लिए होने के बारे में चिंतित हैं, यह एक संग्रहीत प्रक्रिया के लिए परिपक्व है। इस तरह, आपके सभी PHP पृष्ठ केवल संग्रहित प्रक्रिया को कॉल करते हैं (उदाहरण के लिए) केवल कॉपी करने के लिए आईडी और यह वास्तविक प्रतिलिपि प्रक्रिया को नियंत्रित करता है। इस तरह, केवल एक ही जगह है जहां आपको कोड को बनाए रखने की आवश्यकता है, और, मेरी राय में, डीबीएमएस इसे करने का सही स्थान है।

+0

हाँ .. लेकिन मैं बस शुरू कर रहा हूँ। मुझे अब पता लगाना है कि कौन सी संग्रहित प्रक्रियाएं हैं, धन्यवाद! आज सीखने के लिए एक और बात! – user165242

4

आशा है कि इससे किसी की मदद मिलेगी ... अगर आपको कुछ कॉलम कॉपी करने की आवश्यकता है, लेकिन दूसरों को नहीं, और/या कॉलम दोनों टेबल पर एक ही क्रम में नहीं हैं, तो यहां एक छोटी PHP स्क्रिप्ट है। जब तक कॉलम का नाम समान होता है, यह काम करेगा। तो यदि तालिका ए में [userid, हैंडल, कुछ] है और tableB में [userID, हैंडल, टाइमस्टैम्प] है, तो आप "एआईडीआईडी, हैंडल, अब() को tableA से टाइमस्टैम्प के रूप में चुनें", उसके बाद परिणाम प्राप्त करें, और परिणाम को इस फ़ंक्शन ($ z) के पहले पैरामीटर के रूप में पास करें। $ toTable उस तालिका के लिए एक स्ट्रिंग नाम है जिसे आप प्रतिलिपि बना रहे हैं, और $ link_identifier वह डीबी है जिसे आप प्रतिलिपि बना रहे हैं। यह डेटा के छोटे सेट के लिए अपेक्षाकृत तेज़ है। सुझाव नहीं दिया है कि आप उत्पादन सेटिंग में इस तरह एक समय में कुछ हज़ार पंक्तियों को स्थानांतरित करने का प्रयास करें। मैं मुख्य रूप से किसी सत्र के दौरान एकत्र किए गए डेटा का बैकअप लेने के लिए इसका उपयोग करता हूं, जब कोई उपयोगकर्ता लॉग आउट करता है, और फिर इसे धीमा रखने के लिए लाइव डीबी से तुरंत डेटा साफ़ कर देता है।

function mysql_multirow_copy($z,$toTable,$link_identifier) { 
      $fields = ""; 
      for ($i=0;$i<mysql_num_fields($z);$i++) { 
       if ($i>0) { 
        $fields .= ","; 
       } 
       $fields .= mysql_field_name($z,$i); 
      } 
      $q = "INSERT INTO $toTable ($fields) VALUES"; 
      $c = 0; 
      mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. ! 
      while ($a = mysql_fetch_assoc($z)) { 
       foreach ($a as $key=>$as) { 
        $a[$key] = addslashes($as); 
        next ($a); 
       } 
       if ($c>0) { 
        $q .= ","; 
       } 
       $q .= "('".implode(array_values($a),"','")."')"; 
       $c++; 
      } 
      $q .= ";"; 
      $z = mysql_query($q,$link_identifier); 
      return ($q); 
     } 
-4

मैं तुम्हें क्या कहा की कोशिश की, लेकिन मैं यह संदेश वहाँ जहां खंड के साथ एक समस्या है मिल

इस मैं क्या करने की कोशिश की है:

INSERT INTO `seller` SELECT FROM `seller_test` WHERE 
`s_code`=11; 

त्रुटि:

> #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
> near 'FROM `seller` WHERE `s_code`=11' at line 1 

लेकिन जब मैंने * चयन कीवर्ड के बाद * जोड़ा और क्वेरी इस तरह बन गई:

INSERT INTO `seller` SELECT ***** FROM `seller_test` WHERE 
`s_code`=11; 

मैं एक अच्छा परिणाम तो SELECT कीवर्ड

-2

बस इस छोटे से टुकड़ा जो मेरे लिए खूबसूरती से काम करता है जोड़ना चाहते थे के बाद * जोड़ने की कोशिश मिलता है।

जांच your_target_table का चयन करें सम्मिलित करें * से your_rescource_table कहां आईडी = 18;

और जब मैं इसे पर हूँ एक बड़ा चिल्लाओ दे अगली कड़ी प्रो के लिए बाहर, यदि आप इसे उपयोग नहीं कर रहे मैं अत्यधिक इसे डाउनलोड करने की सलाह देते हैं ...

0

वैकल्पिक रूप से जीवन इतना आसान बना देता है, तो आप उपयोग कर सकते हैं इनर ऐसा करने के लिए क्वेरीज़।

SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>); 

आशा है कि इससे मदद मिलती है!

संबंधित मुद्दे