2010-07-14 26 views
5

मुझे आशा है कि मैं इस प्रश्न में बहुत लंबा नहीं रहा हूं, मैं बस यह सुनिश्चित करना चाहता हूं कि जो मैं पूछ रहा हूं वह पूरी तरह स्पष्ट है (मुझे लगता है कि यह भ्रमित है :)।रिलेशनल टेबल डेटा की प्रतिलिपि

मुझे अपने सभी विदेशी कुंजी बाधाओं के साथ तालिकाओं के समूह के साथ एक डेटाबेस मिला है। संबंध कभी-कभी कई टेबल गहरे होते हैं, और ऐसे मामले भी होते हैं जहां एक बच्चा एक से अधिक अभिभावक तालिका से संबंधित होता है। मैं अपनी "शीर्ष स्तर" तालिका पंक्तियों में से एक की प्रतिलिपि बनाना चाहता हूं, और इसके सभी बाल तालिका डेटा से संबंधित है (संबंधपरक अखंडता को बनाए रखना)। यही कहना है कि मेरी नई शीर्ष स्तरीय पंक्ति को अपनी नई प्राथमिक कुंजी (auto_increment के माध्यम से) मिलती है, और सभी नई बाल पंक्तियों को अपनी प्राथमिक कुंजी मिलती है (फिर से auto_increment के माध्यम से), और तालिकाओं की सभी विदेशी कुंजी जानकारी समान रूप से संबंधित होती है डेटा मैंने कॉपी किया (केवल अब नव निर्मित प्राथमिक कुंजी के साथ)। तो अब मेरे पास रिलेशनल डेटा की एक प्रति होगी जो मूल से स्वतंत्र रूप से परिवर्तनीय थी।

मेरा उदाहरण अधिक ठोस बनाने के लिए, मैंने दर्दनाक रूप से एक समान, लेकिन सरल उदाहरण स्थापित किया है। परिभाषित करने देता है निम्न तालिकाओं:

alt text http://www.freeimagehosting.net/uploads/ef22070a89.png

सभी हरी आईडी क्षेत्रों auto_update प्राथमिक चाबियाँ हैं, और पीले रंग के लोगों को विदेशी कुंजी बाधाओं के साथ स्तंभों अनुक्रमित रहे हैं। कहते हैं कि चलो डेटाबेस शुरू में यह में निम्न डेटा है:

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
+----+-------------+---------------+------------+-------------+ 

अब कहते हैं कि मुझे क्या करना चाहते विभाग के एक संबंधपरक प्रतिलिपि H32 (आईडी = 1) बनाते हैं।

मुझे क्या करना चाहिए, निम्न की तरह कुछ है (स्पष्ट रूप से प्राथमिक कुंजी के वास्तविक मान महत्वपूर्ण नहीं हैं, संदर्भित अखंडता है)।

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
| 4 | DEADBEEF | 
| 5 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
| 4 | John   |   4 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
| 3 | H32 |   4 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
| 4 | Billy Bob |    3 |   4 |   4 | 
| 5 | Sandra Lee |    3 |   4 |   5 | 
+----+-------------+---------------+------------+-------------+ 

इस प्रकार के कॉपी ऑपरेशन को लागू करने का सबसे प्रभावी तरीका क्या है? ग्रेल्स के संदर्भ में, इनओडीबी टेबल इंजन का उपयोग करके, मैं इसके लायक होने के लिए माईएसक्यूएल के साथ काम कर रहा हूं। मैं कुछ अच्छे विचारों को सुनने की उम्मीद कर रहा हूं कि आप इस तरह के "सही तरीके" कैसे करते हैं।

- सादर, विक

मैं pastebin पर a MySQLDump of the example प्रारंभ पोस्ट किया है।

संपादित क्या इसके लायक है के लिए, मैं एक बहुत सरल/व्यापक प्रश्न here पोस्ट और मैं आम तौर पर सकारात्मक प्रतिक्रियाएं मिल गया पता चलता है कि मैं नहीं कर रहा हूँ "सिर्फ गलत कर रहा" ...

+0

यदि मैं पूछ सकता हूं, तो संपूर्ण तालिका ग्राफ को प्रतिलिपि बनाने के लिए आपकी प्रेरणा क्या है? आपका प्रश्न डेटा के विसंगति अलार्म को मेरे सिर में बंद कर रहा है। – proflux

+0

@proflux, सहमत है, ऐसा लगता है कि यह एक गहरी प्रतिलिपि –

+0

अलार्म भी यहां चल रहा है, द्वारा डेटा को denormalized किया जा रहा है। – eillarra

उत्तर

1

मेरे पास है INSERT INTO ... SELECT वाक्यविन्यास का उपयोग कर एक समान काम किया। (सी एपीआई में एक MYSQL_OPTION_MULTI_STATEMENTS_ON भी है जिसका उपयोग आप एकाधिक कथन चलाने के लिए कर सकते हैं। या आप एक प्रक्रिया का उपयोग कर सकते हैं)।

यह सबसे प्रभावी है, क्योंकि आपको क्लाइंट और सर्वर के बीच डेटा स्थानांतरित करने की आवश्यकता नहीं है। प्रतिलिपि बनाई गई एक नई इकाई बनाने के लिए एक टेम्पलेट था। मुझे समझ में नहीं आता कि आप इस कण्य डेटा डेटा के साथ ऐसा क्यों कर रहे हैं।

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