मैं दो MySQL तालिकाओं को कैसे मर्ज कर सकता हूं?


92

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

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


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

जवाबों:


123

आप भी आजमा सकते हैं:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

जो तालिका 2 में उन पंक्तियों को तालिका 2 में रखने की अनुमति देता है जिनकी मिलान प्राथमिक कुंजी है, जबकि नई प्राथमिक कुंजी के साथ पंक्तियों को सम्मिलित करते समय।

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

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

नई प्राथमिक कुंजियों के साथ पंक्तियाँ सम्मिलित करते हुए, तालिका 2 से उन पंक्तियों को तालिका 2 से पहले वाली पंक्ति के साथ अपडेट करेंगे।


2
वास्तव में, यह होगा REPLACE मौजूदा पंक्तियों (हटाना + डालने), नहीं अद्यतन।
सेस टिम्मरमैन

क्या होगा अगर टेबल 2 के लिए किसी भी विदेशी कुंजी का उपयोग किया जाए ????? आप इसे कैसे अपडेट करेंगे?
क्षितिज

39

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

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

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


21
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 हालांकि मुझे एक सिंटैक्स त्रुटि देता है। लेकिन मेरे लिए यह काम करता है: से second_table पर नकली चाबी अद्यतन second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1) INSERT INTO first_table चुनें *
टेपार

@ टैपर की तरह, मुझे पहली तालिका में एक उपनाम आवंटित करने के लिए नहीं मिला। मैं मिल जाएगा Syntax error, unexpected IDENT_QUOTED- MySQL कार्यक्षेत्र के माध्यम से वैसे भी।
प्रात: ०१:०१

क्या आप इस बात का उदाहरण दे सकते हैं कि अंतिम पंक्ति में आप क्या कमांड दर्ज करेंगे? मैं तालिका में उच्चतम मौजूदा आईडी से वेतन वृद्धि करना चाहूंगा
इलियट बी

15

यदि आपको इसे मैन्युअल रूप से करने की आवश्यकता है, तो एक बार:

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

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

फिर, कुछ की तरह प्राथमिक कुंजी बाधाओं की पहचान करें

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

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

डुप्लिकेट को हल करें।

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

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


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

7

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

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

0

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

उनके पास "आईडी" कॉलम प्राप्त करने के लिए 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 table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';

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