таблицу - скопировать данные из одной таблицы в другую mysql




Дублирование таблицы, индексов и данных MySQL (6)

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

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

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

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

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

create table {new_table} like {old_table};

Для MySQL

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

Для MSSQL Используйте MyDatabase :

Select * into newCustomersTable  from oldCustomersTable;

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


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

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

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

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

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

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


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

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

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

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

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

второй открыть данные экспорта.

третий замените имя старой таблицы на новое имя таблицы.

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

пятый импортирует ваши отредактированные данные sql в базу данных.


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

CALL duplicate_table('tableName');

Это приведет к дублированию таблицы, называемой tableName_20181022235959 Если tableName_20181022235959 когда

SELECT NOW();

Результаты:

2018-10-22 23:59:59

Реализация

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
;
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
;
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
;

Я нашел ту же ситуацию и подход, который я принял, был следующим: 1. Выполнить SHOW CREATE TABLE: Это даст вам синтаксис Create Table для таблицы, которую вы хотите клонировать. 2. Запустите запрос CREATE TABLE, изменив имя таблицы для клонирования таблицы.

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





mysql