Mysql में टेबल कॉपी करने का सबसे तेज़ तरीका?


82

मैं MySQL में एक टेबल कॉपी करना चाहता हूं। सबसे तेज़ तरीका क्या है? इस कदर?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

या

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

क्या कोई और तरीका है?

संपादित करें: मैं अनुक्रमणिका के फिर से बनाए जाने को लेकर चिंतित हूं, mysql इन कथनों को कैसे आगे बढ़ाता है?

पुनश्च। mysqldump जैसे कमांड-लाइन टूल का उपयोग नहीं कर सकते, ऑन-द-फ्लाई होना चाहिए।

जवाबों:


50

यह तालिका की संरचना को तुरंत कॉपी करता है, लेकिन डेटा नहीं:

CREATE TABLE copy LIKE original;

यह originalतालिका के पास सभी अनुक्रमित बनाता है ।

यह mysql में इस तरह से काम करता है 5.1.39


3
लेकिन, यह ट्रिगर को कॉपी नहीं करेगा।
.साइट्स

3
ध्यान दें, यह भी विदेशी कुंजी बाधाओं की नकल नहीं करेगा।
ओमेर सबिक

47

अनुक्रमणिका को संरक्षित करते समय MyISAM तालिकाओं का उपयोग करने का सबसे तेज़ तरीका ) और शायद अन्य भंडारण इंजन हैं:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

आप अपने डेटाबेस लोड के लिए अपनी कुंजियों को अक्षम करना चाहते हैं और फिर अंत में कुंजियों को फिर से बनाना चाहते हैं।

इसी तरह, InnoDB के लिए :

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(जैसा कि टिप्पणियों में बताया गया है।)


1
अजीब। कुंजियों के साथ INSERT में 36 मिनट लगे, और इस विधि में 10 + 26 मिनट (इन्सर्ट + परिवर्तन) हुए। 6 इंडेक्स, 28 एम रिकॉर्ड, विन 7 x64, 8 जीबी रैम।
प्रति लिंडबर्ग

एक सक्षम कुंजी "मरम्मत तालिका" का कारण बनती है। इस तरह से अपनी प्रक्रिया सूची की जाँच करें। दो प्रकार के होते हैं: 1. की-कैश के साथ रिपेयर टेबल 2. रिपेयर टेबल को छाँट कर, दूसरा अगर उपवास का तरीका हो और केवल तभी उपयोग होगा जब myisam_max_sort_file_size काफी बड़ा हो। dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo

ALTER TABLE table DISABLE/ENABLE KEYSInnoDB में काम नहीं करता है, और नीचे चेतावनी देता है Table storage engine for 'table' doesn't have this option
अमिल वडूवारा

1
innodb SET unique_checks=0; SET foreign_key_checks=0;इंसर्ट के लिए यहां sql कोड डालेंSET unique_checks=1; SET foreign_key_checks=1;
tuk

13

से मैनुअल :

"TABLE बनाएँ ... SELECT आपके लिए स्वचालित रूप से कोई इंडेक्स नहीं बनाता है। यह जानबूझकर स्टेटमेंट को लचीला बनाने के लिए किया जाता है। यदि आप क्रिएट टेबल में इंडेक्स रखना चाहते हैं, तो आपको SELECT स्टेटमेंट से पहले इनका उल्लेख करना चाहिए:"

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

आप सूचक और डेटा प्रकार (डेटाटाइप रूपांतरण से बचने के लिए) दोनों के साथ निर्दिष्ट कर सकते हैं CREATE TABLE LIKEऔर CREATE TABLE SELECT। कौन सा तेज़ है यह आपके सेटअप पर निर्भर करेगा।


9

अनुक्रमित और ट्रिगर के साथ कॉपी करने के लिए इन 2 प्रश्नों को करें:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

केवल संरचना और डेटा की प्रतिलिपि बनाने के लिए इसे उपयोग करें:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

के INSERT INTOबजाय नहीं होना चाहिए INSERT?
गिएर्डानो

6

create table mynewtable (select * from myoldtable)Mysql में काम करता है ? अगर ऐसा है तो आप भी इसे आजमा सकते हैं।


5

संरचना और सभी प्रविष्टियों को एक तालिका से दूसरी तालिका (नई तालिका बनाकर) की प्रतिलिपि बनाने का सबसे अच्छा तरीका यह प्रश्न है ...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;


3

प्रयास करें SELECT INTO, और एक चर का उपयोग करें को बीच-बीच में इस्तेमाल करें।

आपको स्रोत तालिका के समान संरचना प्राप्त करने के लिए, प्राप्त करने वाली तालिका बनानी होगी।

सबसे अच्छी बात यह है कि यह आंतरिक है इसलिए यह तेज़ है। आप अपने अनुक्रमित खो देंगे, यद्यपि।


MySQL द्वारा समर्थित नहीं है का चयन करें
ड्रेको एटर

@ ड्रेको एटर - हां, यह करता है। यह सिर्फ चरों का उपयोग करता है।
एम्फ़ैटेमाचिन

2
क्या आप एक उदाहरण प्रदान कर सकते हैं? क्योंकि मुझे लगता है, कि चर केवल उस अंतिम मान को रखेंगे जो कि चयन द्वारा पढ़ा गया था, लेकिन तालिका में सभी मान नहीं। जब तक आप एक कर्सर का उपयोग नहीं करते हैं और एक से अधिक पंक्ति वाली तालिकाओं को कॉपी नहीं करना चाहते हैं, यह समाधान बिल्कुल भी काम नहीं करता है।
फैंसीपैंट

2

यदि आप MyISAM का उपयोग कर रहे हैं, तो आप induvidual फ़ाइलों की प्रतिलिपि बना सकते हैं और उनका नाम बदल सकते हैं। .MYD, .MYI, .FRM बैकएंड में फाइलें


1

शायद आप देख सकते हैं SHOW CREATE TABLE

कदम उठाने के लिए:

  • Phpmyadmin पर जाएं

  • SQL पर जाएं

इस क्वेरी को निष्पादित करें

SHOW CREATE TABLE `the_old_table`;
  • विकल्प पर क्लिक करें "पूर्ण ग्रंथों" की जाँच करें और गो दबाएं।

परिणाम एक पूर्ण सृजन कथन है। जब तक आप खुश न हों तब तक क्वेरी संपादित करें।

संसाधन: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html


0
CREATE TABLE copy SELECT * FROM original;

एक तेज़ तरीका है, लेकिन शायद अनुक्रमणिका का सबसे तेज़ कारण नहीं है।


कृपया अपने उत्तर को संपादित करें और इसे पठनीय बनाने के लिए इसे ठीक से प्रारूपित करें।
नेकु

1
यह कथन न तो अनुक्रमणिका की प्रतिलिपि बनाता है और न ही इस तालिका से संबद्ध ट्रिगर करता है।
7:12 बजे नर्सरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.