एक MySQL तालिका, सूचकांक और डेटा की नकल करना


668

मैं MySQL तालिका के डेटा, संरचना और सूचकांकों की प्रतिलिपि या क्लोन या नक़ल कैसे करूँ?

यह वही है जो मैंने अब तक पाया है।

यह डेटा और संरचना को कॉपी करेगा, लेकिन सूचकांकों को नहीं:

create table {new_table} select * from {old_table};

यह संरचना और सूचकांक की नकल करेगा, लेकिन डेटा नहीं:

create table {new_table} like {old_table};

जवाबों:


1487

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

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

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

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

मैंने इससे पहले पूछा है:

अनुक्रमित सहित एक MySQL तालिका की प्रतिलिपि बनाएँ


10
वर्थ नोटिंग कि पुरानी चाबियों की ओर इशारा करने वाली विदेशी चाबियों को नईटेबल में कॉपी करना होगा (यदि आप पुरानी पसंद बदल रहे हैं)
जॉर्ज

3
क्या यह बड़ी तालिकाओं (लाखों रिकॉर्ड) के लिए काम करता है? .. मैं पूछ रहा हूं क्योंकि मुझे नहीं पता कि यह select *विशाल तालिकाओं में कैसा प्रदर्शन करेगा।
फर्गिलन

3
एक मोटा विचार देने के लिए, इन्सर्ट ऑपरेशन ने AWS db.r3.large उदाहरण पर 16M पंक्तियों (5 अनुक्रमित के साथ) की एक मेज पर 27mins लिया
hello_harry

6
यह ध्यान देने योग्य है कि जब यह प्रतिलिपि बनाई जा रही तालिका से अनुक्रमणिका को फिर से बनाता है, तो यह किसी भी विदेशी प्रमुख बाधाओं को पार नहीं करता है ।
WebSmithery

15
नोट: यह AUTO_INCREMENTमान कॉपी नहीं करेगा ।
मैट जांसेन

43

उपरोक्त समाधान के अलावा, आप ASइसे एक पंक्ति में बनाने के लिए उपयोग कर सकते हैं ।

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

32
यह अनुक्रमणिकाओं और ट्रिगर्स की प्रतिलिपि नहीं करेगा क्योंकि SELECT परिणाम एक (अनाम) अस्थायी तालिका है और स्रोत तालिका के मेटाडेटा को "कैरी" नहीं करता है। विचार करें कि क्या आप फ़ंक्शन का उपयोग कर रहे हैं, इसका कोई मतलब नहीं होगा।
chx

1
मैं संरचना तालिका को बैकअप ले रहा था और डेटा को केवल स्थानांतरित कर रहा था, इस प्रकार अनुक्रमित / बाधाओं / आदि को छोड़ रहा था। इसलिए मैं उन्हें फिर से बना सका। यह जवाब उस मायने में भयानक था, जब Google ने मुझे यहां भेजा था।
एल्सडिल

3
यह वही है जो पहले से ही सवाल में उल्लेख करता है: create table {new_table} select * from {old_table};उत्तर नहीं और कोई नई जानकारी प्रदान नहीं करता है।
16

14

MySQL तरीका:

CREATE TABLE recipes_new LIKE production.recipes;
INSERT recipes_new SELECT * FROM production.recipes;

यह स्वीकृत उत्तर होना चाहिए था। जैसा कि यह प्राथमिक कुंजी और auto_increment सहित सभी अनुक्रमित प्रतियों को
समेटता है

10

PhpMyAdmin पर जाएं और अपनी मूल तालिका का चयन करें फिर " प्रतिलिपि तालिका में (database.table) " क्षेत्र में " ऑपरेशन " टैब चुनें । उस डेटाबेस का चयन करें, जहाँ आप अपनी नई तालिका के लिए नाम जोड़ना और जोड़ना चाहते हैं।

कॉपी टेबल - phyMyAdmin स्क्रीनशॉट


1
@AaronJSpetner यह उत्तर अभी भी अन्य उपयोगकर्ताओं के लिए उपयोगी है जो इस प्रश्न पर आते हैं और समस्या को हल करने के लिए PHPMyAdmin का उपयोग करने में सक्षम हैं।
सुधार हुआ

3

मुझे वही स्थिति मिली और जो दृष्टिकोण मैंने लिया वह इस प्रकार था:

  1. निष्पादित करें SHOW CREATE TABLE <table name to clone>: यह आपको Create Tableउस तालिका के लिए सिंटैक्स देगा जो आप क्लोन करना चाहते हैं
  2. CREATE TABLEतालिका को क्लोन करने के लिए तालिका का नाम बदलकर क्वेरी चलाएँ ।

यह तालिका की सटीक प्रतिकृति बनाएगा जिसे आप अनुक्रमित के साथ क्लोन करना चाहते हैं। केवल एक चीज जो आपको चाहिए, वह है अनुक्रमणिका का नाम बदलना (यदि आवश्यक हो)।


2

तालिका को डुप्लिकेट करने का बेहतर तरीका केवल DDLकथन का उपयोग करना है । इस तरह, तालिका में रिकॉर्ड की संख्या से स्वतंत्र रूप से, आप दोहराव को तुरंत प्रदर्शन कर सकते हैं।

मेरा उद्देश्य है:

DROP TABLE IF EXISTS table_name_OLD;
CREATE TABLE table_name_NEW LIKE table_name;
RENAME TABLE table_name TO table_name_OLD;
RENAME TABLE table_name _NEW TO table_name;

यह उस INSERT AS SELECTकथन से बचता है, जिसमें बहुत सारे रिकॉर्ड के साथ तालिका के निष्पादन में समय लग सकता है।

मैं निम्नलिखित उदाहरण के रूप में एक PLSQL प्रक्रिया बनाने का सुझाव देता हूं:

DELIMITER //
CREATE PROCEDURE backup_table(tbl_name varchar(255))
BEGIN
  -- DROP TABLE IF EXISTS GLS_DEVICES_OLD;
  SET @query = concat('DROP TABLE IF EXISTS ',tbl_name,'_OLD');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  -- CREATE TABLE GLS_DEVICES_NEW LIKE GLS_DEVICES;
  SET @query = concat('CREATE TABLE ',tbl_name,'_NEW LIKE ',tbl_name);
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;

  -- RENAME TABLE GLS_DEVICES TO GLS_DEVICES_OLD;
  SET @query = concat('RENAME TABLE ',tbl_name,' TO ',tbl_name,'_OLD');
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;  

  --  RENAME TABLE GLS_DEVICES_NEW TO GLS_DEVICES;
  SET @query = concat('RENAME TABLE ',tbl_name,'_NEW TO ',tbl_name);
  PREPARE stmt FROM @query;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt; 
END//
DELIMITER ;

आपका दिन शुभ हो! एलेक्स


क्या किसी ने यह कोशिश की है? क्या यह उम्मीद के मुताबिक काम करता है?
राडू मुरझिया

1

इस उत्तर पर विस्तार एक संग्रहीत प्रक्रिया का उपयोग कर सकता है:

CALL duplicate_table('tableName');

जिसके परिणामस्वरूप डुप्लीकेट टेबल हो जाएगा जिसे tableName_20181022235959इफ कहा जाता है

SELECT NOW();

परिणाम:

2018-10-22 23:59:59

कार्यान्वयन

DELIMITER $$
CREATE PROCEDURE duplicate_table(IN tableName VARCHAR(255))
  BEGIN
    DECLARE schemaName VARCHAR(255) DEFAULT SCHEMA();
    DECLARE today VARCHAR(14) DEFAULT REPLACE(REPLACE(REPLACE(NOW(), '-', ''), ' ', ''), ':', ''); -- update @ year 10000
    DECLARE backupTableName VARCHAR(255) DEFAULT CONCAT(tableName, '_', today);

    IF fn_table_exists(schemaName, tableName)
      THEN
        CALL statement(CONCAT('CREATE TABLE IF NOT EXISTS ', backupTableName,' LIKE ', tableName));
        CALL statement(CONCAT('INSERT INTO ', backupTableName,' SELECT * FROM ', tableName));
        CALL statement(CONCAT('CHECKSUM TABLE ', backupTableName,', ', tableName));
      ELSE
        SELECT CONCAT('ERROR: Table "', tableName, '" does not exist in the schema "', schemaName, '".') AS ErrorMessage;
      END IF;
  END $$
DELIMITER ;

DELIMITER $$
CREATE FUNCTION fn_table_exists(schemaName VARCHAR(255), tableName VARCHAR(255))
  RETURNS TINYINT(1)
  BEGIN
    DECLARE totalTablesCount INT DEFAULT (
      SELECT COUNT(*)
      FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA COLLATE utf8_general_ci = schemaName COLLATE utf8_general_ci)
        AND (TABLE_NAME COLLATE utf8_general_ci = tableName COLLATE utf8_general_ci)
    );
    RETURN IF(
      totalTablesCount > 0,
      TRUE,
      FALSE
    );
  END $$
DELIMITER ;

DELIMITER $$
CREATE PROCEDURE statement(IN dynamic_statement TEXT)
  BEGIN
      SET @dynamic_statement := dynamic_statement;
      PREPARE prepared_statement FROM @dynamic_statement;
      EXECUTE prepared_statement;
      DEALLOCATE PREPARE prepared_statement;
  END $$
DELIMITER ;

1

ऊपर के समाधान की कोशिश करने के बाद, मैं अपने तरीके से आता हूं।

मेरा समाधान थोड़ा मैनुअल और DBMS की जरूरत है।

सबसे पहले, डेटा निर्यात करें।

दूसरा, निर्यात डेटा खोलें।

तीसरा, पुराने तालिका नाम को नए तालिका नाम से बदलें।

चौथा, डेटा में सभी ट्रिगर नाम बदलें (मैं MySQL का उपयोग करता हूं और जब मैं ट्रिगर नाम नहीं बदलता हूं तो यह त्रुटि दिखाता है)।

पांचवां, अपने संपादित SQL डेटा को डेटाबेस में आयात करें।


0

इसे इस्तेमाल करे :

`CREATE TABLE new-table (id INT(11) auto_increment primary key) SELECT old-table.name, old-table.group, old-table.floor, old-table.age from old-table;`

मैंने पुरानी-तालिका से 4 कॉलम चुने और एक नई तालिका बनाई।


-2

MySQL के लिए

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

MSSQL उपयोग के लिए MyDatabase:

Select * into newCustomersTable  from oldCustomersTable;

इस एसक्यूएल का उपयोग तालिकाओं की प्रतिलिपि बनाने के लिए किया जाता है, यहां पुराने कस्टमग्राहक की सामग्री को कॉपी किया जाएगा newCustomersTable
सुनिश्चित करें कि डेटाबेस में मौजूद newCustomersTable नहीं है।


4
थ्रो एरर SQL एरर (3172): अघोषित वेरिएबल: 'newCustomerTable'
mikewasmike

आप कुछ गलत कर रहे होंगे। चूंकि यह 100% काम करेगा। नकारात्मक वोट देने से पहले पढ़ें। आपके लिए सामग्री संदर्भ। w3schools.com/sql/sql_select_into.asp
कृष्णिल

1
ध्यान दें कि प्रश्न MySQL के बारे में है। कुछ SQL सिंटैक्स का समर्थन नहीं किया जा सकता है।
mikewasmike

1
MySQL वे क्रिएट टेबल रेसिपी_new प्रोडक्शन। INSERT recipes_new Select * FROM production.recipes;
कृष्णनील

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