একটি মাইএসকিউএল টেবিল, সূচক এবং ডেটা সদৃশ


668

আমি কীভাবে কোনও মাইএসকিউএল টেবিলের তথ্য, কাঠামো এবং সূচকগুলি অনুলিপি বা ক্লোন বা নকল করতে পারি?

এটি আমি এখনও অবধি খুঁজে পেয়েছি।

এটি ডেটা এবং কাঠামো অনুলিপি করবে তবে সূচকগুলি নয়:

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;

আমি এটি আগে জিজ্ঞাসা করেছি:

সূচিপত্র সহ একটি মাইএসকিউএল টেবিল অনুলিপি করুন


10
পুরানো টেবিলের দিকে ইঙ্গিতকারী বিদেশী কীগুলি নতুন টেবিলের অনুলিপি করা প্রয়োজন (আপনি যদি পুরানো টেবিলটি প্রতিস্থাপন করছেন)
জর্জ

3
এটি কি বড় টেবিলগুলির জন্য কাজ করে (কয়েক মিলিয়ন রেকর্ড)? .. আমি জিজ্ঞাসা করছি কারণ এটি কীভাবে select *বিশাল টেবিলগুলিতে সঞ্চালন করবে তা আমি জানি না ।
fguillen

3
মোটামুটি ধারণা দেওয়ার জন্য, সন্নিবেশ অপারেশনটি একটি এডাব্লুএস db.r3.large উদাহরণে 16 এম সারিগুলির একটি টেবিলে (5 সূচী সহ) 27 মিনিট নিয়েছিল
হ্যালো_হারি

6
এটি লক্ষণীয় যে এটি যখন টেবিল থেকে অনুলিপিগুলি অনুলিপি করা হচ্ছে তখন এটি কোনও বিদেশী কী বাধাগুলি বহন করে না
ওয়েবস্মিথ্রি

15
দ্রষ্টব্য: এটি AUTO_INCREMENTমানটির অনুলিপি করবে না ।
ম্যাট জানসেন

43

উপরের সমাধানটি বাদ দিয়ে আপনি ASএটিকে এক লাইনে তৈরি করতে ব্যবহার করতে পারেন ।

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

32
এটি সূচীগুলি এবং ট্রিগারগুলি অনুলিপি করবে না কারণ নির্বাচন ফলাফল একটি (নামবিহীন) অস্থায়ী সারণী এবং উত্স সারণীর মেটাডেটা "বহন করে না"। আপনি যদি ফাংশন ব্যবহার করছেন তা বিবেচনা করুন, এটি কোনও অর্থবোধ করবে না।
chx

1
আমি কাঠামোর টেবিলটির ব্যাকআপ খুঁজছিলাম এবং কেবলমাত্র ডেটা সরিয়ে নিয়ে যাই, এভাবে সূচি / সীমাবদ্ধতা / ইত্যাদি বাদ দেয়। যাতে আমি তাদের পুনরায় তৈরি করতে পারি। গুগল আমাকে এখানে পাঠিয়েছে বলে এই উত্তরটি দুর্দান্ত ছিল।
এলিলেসিল

3
এই প্রশ্নটিতে তিনি ইতিমধ্যে উল্লেখ করেছেন: create table {new_table} select * from {old_table};উত্তর নয় এবং কোনও নতুন তথ্য সরবরাহ করে না।
বিলিন্নাহ

14

মাইএসকিউএল উপায়:

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

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ছিল। যেহেতু এটি প্রাথমিক কী এবং অটো_সৃজন সহ সমস্ত সূচক অনুলিপি করেছে
চান্নাবীর হাকারি

10

পিএইচপিএমআইএডমিনে যান এবং আপনার মূল টেবিলটি নির্বাচন করুন তারপরে " টেবিল অনুলিপি (ডাটাবেস.ট্যাবল) " এ " অপারেশনস " ট্যাবটি নির্বাচন করুন । আপনি যে নতুন ডাটাবেসটি অনুলিপি করতে চান এবং আপনার নতুন সারণির জন্য একটি নাম যুক্ত করতে চান তা নির্বাচন করুন।

কপি টেবিল - phyMyAdmin স্ক্রিনশট


1
@ অ্যারোনজেস্পটনার এই উত্তরটি এখনও অন্য ব্যবহারকারীদের জন্য সহায়ক যারা এই প্রশ্নে এসেছেন এবং এই সমস্যাটি সমাধানের জন্য পিএইচপিএমআইএডমিন ব্যবহার করতে সক্ষম হন।
সংস্কার করা হয়েছে

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বিবৃতি এড়িয়ে যায় যে, অনেকগুলি রেকর্ড সহ টেবিলের ক্ষেত্রে মৃত্যুদন্ড কার্যকর হতে সময় নিতে পারে।

আমি নিম্নলিখিত উদাহরণ হিসাবে একটি পিএলএসকিউএল পদ্ধতি তৈরি করার পরামর্শ দিচ্ছি:

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 প্রয়োজন।

প্রথমে ডেটা রফতানি করুন।

দ্বিতীয়ত, রফতানির ডেটা খুলুন।

তৃতীয়ত, পুরানো টেবিলের নামটি নতুন টেবিলের নামের সাথে প্রতিস্থাপন করুন।

চতুর্থত, ডেটাতে সমস্ত ট্রিগার নাম পরিবর্তন করুন (আমি মাইএসকিউএল ব্যবহার করি এবং যখন আমি ট্রিগার নাম পরিবর্তন করি না তখন এটি ত্রুটি দেখায়)।

পঞ্চম, ডাটাবেসে আপনার সম্পাদিত এসকিউএল ডেটা আমদানি করুন।


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

মাইএসকিউএল জন্য

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

এমএসএসকিউএল ব্যবহারের জন্য MyDatabase:

Select * into newCustomersTable  from oldCustomersTable;

এই এসকিউএলটি টেবিলগুলি অনুলিপি করার জন্য ব্যবহৃত হয়, এখানে পুরানো কাস্টোমারস টেবিলের বিষয়বস্তু অনুলিপি করা হবে newCustomersTable
নিশ্চিত করুন newCustomersTable নেই ডাটাবেসের মধ্যে বিদ্যমান।


4
ত্রুটি ত্রুটি এসকিউএল ত্রুটি (3172): অঘোষিত ভেরিয়েবল: 'নিউকাস্টমার টেবিল'
মাইকওয়াসেমিকে

আপনি ভুল কিছু কাজ করতে হবে। যেহেতু এটি 100% কাজ করবে। আপনার নেতিবাচক ভোট দেওয়ার আগে পড়ুন। আপনার জন্য সামগ্রী রেফারেন্স। w3schools.com/sql/sql_select_into.asp
কৃষ্ণাইল

1
নোট করুন যে প্রশ্নটি মাইএসকিউএল সম্পর্কে। কিছু এসকিউএল সিনট্যাক্স সমর্থিত নাও হতে পারে।
মাইকওয়াসেমিকে

1
মাইএসকিউএল ওয়ে ক্রেবল টেবিলের রেসিপি_ নতুন লাইক প্রোডাকশন.রেসিপস; INSERT রেসিপি_ নতুন নির্বাচন করুন * প্রোডাকশন.রেসিপস থেকে;
কৃষ্ণাইল

1
পূর্ববর্তী উত্তরটি কেবল এমএসএসকিউএলএল
কৃষ্ণাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.