2009-04-07 21 views
79

मैं दो MySQL तालिकाओं को कैसे विलय कर सकता हूं जिनके समान संरचना है?मैं दो MySQL तालिकाओं को कैसे विलय कर सकता हूं?

दो तालिकाओं की प्राथमिक कुंजी संघर्ष करेंगे, इसलिए मैंने इसे ध्यान में रखा है।

+6

जब आप कहते हैं कि पीकेएस टकराव हो सकता है, आप का मतलब है कि वहाँ डुप्लीकेट पंक्तियों हो सकता है और आप उन्हें कॉपी नहीं करना चाहते, या कि तुम क्योंकि वे कर रहे हैं उनमें से एक के लिए एक नया पी सौंपने होंगे एक ही पीके होने के बावजूद वास्तव में अलग पंक्तियां?(प्राकृतिक प्राथमिक कुंजी का उपयोग करने का एक अन्य कारण) –

उत्तर

105

तुम भी कोशिश कर सकते हैं:

INSERT IGNORE 
    INTO table_1 
SELECT * 
    FROM table_2 
    ; 

जो, table_2 में उन लोगों के लिए एक मिलान प्राथमिक कुंजी है अधिक्रमण करने table_1 में उन पंक्तियों की अनुमति देता है, जबकि अभी भी नया प्राथमिक कुंजी के साथ पंक्तियों डालने।

वैकल्पिक रूप से,

REPLACE 
    INTO table_1 
SELECT * 
    FROM table_2 
     ; 

, पहले से ही table_2 से संबंधित पंक्ति के साथ table_1 में उन पंक्तियों को अद्यतन करेगा नया प्राथमिक कुंजी के साथ पंक्तियों डालने जबकि।

+2

क्या यह कई तालिकाओं से हो सकता है? – SaidbakR

+1

असल में, यह [REPLACE] (http://code.openark.org/blog/mysql/replace-into-think-twice) मौजूदा पंक्तियां (हटाएं + डालें) अपडेट नहीं होगा। –

13

आप मैन्युअल रूप से ऐसा करने की जरूरत है, एक समय:

create table MERGED as select * from table 1 UNION select * from table 2 

फिर,

की तरह कुछ के साथ प्राथमिक कुंजी की कमी की पहचान:

सबसे पहले, एक अस्थायी तालिका में, की तरह कुछ के साथ विलय

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1 

कहाँ पी प्राथमिक कुंजी क्षेत्र है ...

dupl का समाधान icates।

तालिका का नाम बदलें।

[संपादित - यूनिअन क्वेरी में हटा कोष्ठक है, जो नीचे टिप्पणी में त्रुटि पैदा कर रहा था]

+0

जब मैं इसे आज़माता हूं तो मुझे यह त्रुटि मिली, "त्रुटि 1064 (42000): आपको अपने SQL वाक्यविन्यास में कोई त्रुटि है; सही वाक्यविन्यास के लिए आपके MySQL सर्वर संस्करण से संबंधित मैन्युअल जांचें लाइन पर 'यूनियन चयन * अभिनेता से' का उपयोग करने के लिए ', वह क्यों है? – jcho360

19
INSERT 
INTO first_table f 
SELECT * 
FROM second_table s 
ON DUPLICATE KEY 
UPDATE 
     s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1) 
+1

अच्छे विचार के लिए धन्यवाद। उपरोक्त cmd मुझे हालांकि एक वाक्यविन्यास त्रुटि देता है। लेकिन यह मेरे लिए काम करता है: सम्मिलित जांच first_table चुनें * से second_table पर नकली चाबी अद्यतन second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1) – Tapper

+0

बस @Tapper की तरह, मैं पहली बार के लिए एक अन्य नाम आवंटित करने के लिए नहीं मिल सका तालिका। मुझे 'सिंटेक्स त्रुटि, अप्रत्याशित IDENT_QUOTED' मिलेगा - MySQL वर्कबेंच के माध्यम से वैसे भी। – blo0p3r

35

यह प्राथमिक कुंजी के अर्थ पर निर्भर करता है। यदि यह महज AutoIncrement है, तो कुछ इस तरह का उपयोग करें:

insert into table1 (all columns except pk) 
select all_columns_except_pk 
from table2; 

पी कुछ का मतलब है, तो आप यह निर्धारित करने के रिकॉर्ड प्राथमिकता होनी चाहिए एक रास्ता खोजने की जरूरत है। आप पहले डुप्लीकेट खोजने के लिए एक चुनिंदा क्वेरी बना सकते हैं (answer by cpitis देखें)। फिर उन लोगों को खत्म करें जिन्हें आप रखना नहीं चाहते हैं और ऊपर दिए गए रिकॉर्ड्स को जोड़ने के लिए उपरोक्त डालने का उपयोग करें।

0

आप अद्यतन करने के लिए एक स्क्रिप्ट लिख सकता है FK के लिए आप .. इस ब्लॉग की जाँच: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

वे INFORMATION_SCHEMA तालिकाओं का उपयोग करने के लिए "आईडी" कॉलम पाने के लिए एक चालाक स्क्रिप्ट है:

SET @db:='id_new'; 

select @max_id:=max(AUTO_INCREMENT) from information_schema.tables; 

select concat('update ',table_name,' set ', column_name,' = ',column_name,'+',@max_id,' ; ') from information_schema.columns where [email protected] and column_name like '%id' into outfile 'update_ids.sql'; 

use id_new 
source update_ids.sql; 
5

जितना जटिल लगता है उतना जटिल नहीं .... बस अपनी क्वेरी से डुप्लिकेट प्राथमिक कुंजी छोड़ दें .... यह मेरे लिए काम करता है!

INSERT INTO 
    Content(
    `status`, 
    content_category, 
    content_type, 
    content_id, 
    user_id, 
    title, 
    description, 
    content_file, 
    content_url, 
    tags, 
    create_date, 
    edit_date, 
    runs 
) 
SELECT `status`, 
    content_category, 
    content_type, 
    content_id, 
    user_id, 
    title, 
    description, 
    content_file, 
    content_url, 
    tags, 
    create_date, 
    edit_date, 
    runs 
FROM 
    Content_Images 
संबंधित मुद्दे

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