Дублирование таблицы, индексов и данных MySQL - PullRequest
602 голосов
/ 19 июля 2010

Как мне скопировать или клонировать или дублировать данные, структуру, а индексы таблицы MySQL на новую?

Это то, что я нашел до сих пор.

Это скопирует данные и структуру, но не индексы:

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

Это скопирует структуру и индексы, но не данные:

create table {new_table} like {old_table};

Ответы [ 10 ]

1353 голосов
/ 19 июля 2010

Для копирования с индексами и триггерами выполните следующие 2 запроса:

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

Чтобы скопировать только структуру и данные, используйте это:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Я спрашивал это раньше:

Копировать таблицу MySQL, включая индексы

43 голосов
/ 22 апреля 2015

Помимо приведенного выше решения, вы можете использовать AS, чтобы сделать его одной строкой.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
9 голосов
/ 20 декабря 2016

MySQL:

CREATE TABLE recipes_new LIKE production.recipes;
INSERT recipes_new SELECT * FROM production.recipes;
8 голосов
/ 20 октября 2017

Перейдите на phpMyAdmin и выберите исходную таблицу, затем выберите вкладку « Операции » в области « Копировать таблицу в (database.table) ». Выберите базу данных, в которую вы хотите скопировать, и добавьте имя для новой таблицы.

copy table - phyMyAdmin Screenshot

2 голосов
/ 05 мая 2016

Я обнаружил ту же ситуацию и применил следующий подход:

  1. Выполнить SHOW CREATE TABLE <table name to clone>: Это даст вам синтаксис Create Table для таблицы, которую вы хотите клонировать
  2. Запустите запрос CREATE TABLE, изменив имя таблицы для клонирования таблицы.

Это создаст точную копию таблицы, которую вы хотите клонировать вместе с индексами.Единственное, что вам нужно, это переименовать индексы (если требуется).

1 голос
/ 16 апреля 2019

Лучший способ дублировать таблицу - использовать только оператор 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 ;

Хорошего дня! Alex

1 голос
/ 25 мая 2017

После того, как я попробовал решение выше, я придумываю свой собственный путь.

Мое решение немного ручное и нуждается в СУБД.

Сначала экспортируйте данные.

Во-вторых, откройте данные экспорта.

В-третьих, заменить старое имя таблицы новым именем таблицы.

В-четвертых, измените все имя триггера в данных (я использую MySQL, и я вижу ошибку, когда я не меняю имя триггера).

В-пятых, импортируйте отредактированные данные SQL в базу данных.

0 голосов
/ 29 апреля 2019

Попробуйте:

`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 столбца из старой таблицы и создал новую таблицу.

0 голосов
/ 22 октября 2018

Расширяя этот ответ можно использовать хранимую процедуру:

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 ;
0 голосов
/ 06 марта 2016

FOR MySQL

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

FOR MSSQL Использовать MyDatabase:

Select * into newCustomersTable  from oldCustomersTable;

Этот SQL используется для копирования таблиц, здесь содержимое oldCustomersTable будет скопировано в newCustomersTable.
Убедитесь, что newCustomersTable не существует в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...