2011-11-01 19 views
7

हमारे पास निम्न परिदृश्य है जहां foo का नाम foo1 रखा गया है।विभिन्न डेटाबेस में 2 टेबल/विभिन्न कॉलम के साथ डेटा को स्थानांतरित करने के लिए

foo.col1 का नाम बदलकर foo1.col11 रखा गया है।

foo.col2

हटा दिया गया है वास्तव में इन समान टेबल हुआ करता था और मैं एक से डेटा कॉपी करने के लिए इन तालिकाओं के लिए बी करना चाहते हैं। मैं एक साधारण माइग्रेशन करने के बारे में कैसे जाउंगा क्योंकि तालिका/कॉलम नामों में बदलाव आया है।

Database 'A' 
create table foo {id pk, col1 varchar(255), col2 tinyint(1), col3 datetime); 
create table foo_bar1 (id pk, foo_id fk, col4 datetime, col5 varchar(255)); 

Database 'B' 
create table foo1 {id pk, col11 varchar(255), col3 datetime); 
create table foo1_bar1 (id pk, foo1_id fk, col4 datetime, col5 varchar(255)); 
+0

बीएफयू (आईडी, कोल 11, कॉल 3) में इन्सर्ट करें आईडी, कॉल 1, ए 3 से कॉल 3 – dwalldorf

उत्तर

9

तुम क्या करने में सक्षम होना चाहिए:

INSERT INTO B.foo1 (id, col11, col3) 
SELECT id,col1,col3 FROM A.foo; 

INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
SELECT id,foo_id,col4,col5 FROM A.foo_bar1; 
+0

क्या एसक्यूएल स्क्रिप्ट के लिए डेटाबेस नामों को पास करने का कोई तरीका है जिसे डेटाबेस 'बी' – priya

+0

पर निष्पादित किया जाएगा यदि आप उपरोक्त एसक्यूएल स्टेटमेंट देखते हैं तो आप देख सकते हैं कि डेटाबेस नाम पहले ही शामिल है, आपको इसकी आवश्यकता नहीं है अपनी एसक्यूएल स्क्रिप्ट में डेटाबेस का चयन करने के लिए। जैसे। में डालें। ... अगर आपने – Gryphius

+0

से पहले "" का चयन नहीं किया है, तो भी काम करता है, क्या स्रोत डेटाबेस को तर्क के रूप में पास करने का कोई तरीका है (उदाहरण के लिए 'ए') – priya

1
BEGIN; 
INSERT INTO B.foo1 (id, col11, col3) 
    SELECT id, col1, col3 
    FROM A.foo; 
INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
    SELECT id, foo_id, col4, col5 
    FROM A.foo_bar1; 
COMMIT; 
1

कॉलम हटा दिया गया है आप क्वेरी परिणामों की एक सीधी डालने कर सकते हैं पता है:

INSERT INTO B.foo1 (id, col11, col3) (SELECT id, col1, col3 FROM A.foo); 
INSERT INTO B.foo_bar1 (id, foo1_id, col4, col5) (SELECT id, foo_id, col4, col5 FROM A.foo_bar1); 
1

एक अन्य समाधान जिसमें आपके दूसरे प्रश्न को स्रोत डेटाबेस नाम गतिशील रूप से

सेट करने के लिए शामिल किया गया है

अपनी स्क्रिप्ट 'bla.sql' बनाने:

SET @q = CONCAT('INSERT INTO B.foo1 (id, col11, col3) 
    SELECT id,col1,col3 FROM ',@sourcedb,'.foo'); 
PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

(अतिरिक्त बयान रूप में की जरूरत को जोड़ने)

तो कंसोल से चलाएँ:

mysql -e "SET @sourcedb:='A' ; source bla.sql;" B -u root 

इस समाधान के लिए स्रोत: variable database name और कोनेरक्स टिप्पणी ;-)

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