Дублирование таблицы, индексов и данных MySQL
Как мне скопировать или клонировать или дублировать данные, структуру и индексы таблицы MySQL в новую?
Это то, что я нашел до сих пор.
Это скопирует данные и структуру, но не индексы:
create table {new_table} select * from {old_table};
Это скопирует структуру и индексы, но не данные:
create table {new_table} like {old_table};
Ответы
Ответ 1
Для копирования с индексами и триггерами выполните следующие 2 запроса:
CREATE TABLE newtable LIKE oldtable;
INSERT INTO newtable SELECT * FROM oldtable;
Чтобы скопировать только структуру и данные, используйте это:
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Я спрашивал об этом раньше:
Скопируйте таблицу MySQL, включая индексы
Ответ 2
Помимо решения выше, вы можете использовать AS
, чтобы сделать его в одной строке.
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Ответ 3
MySQL способ:
CREATE TABLE recipes_new LIKE production.recipes;
INSERT recipes_new SELECT * FROM production.recipes;
Ответ 4
Перейдите в phpMyAdmin и выберите исходную таблицу, затем выберите вкладку " Операции " в области " Копировать таблицу в (database.table) ". Выберите базу данных, в которую вы хотите скопировать, и добавьте имя для новой таблицы.
![copy table - phyMyAdmin Screenshot]()
Ответ 5
Я обнаружил ту же ситуацию, и подход, который я использовал, заключался в следующем:
- Выполнить
SHOW CREATE TABLE <table name to clone>
: это даст вам синтаксис Create Table
для таблицы, которую вы хотите клонировать - Запустите запрос
CREATE TABLE
, изменив имя таблицы, чтобы клонировать таблицу.
Это создаст точную копию таблицы, которую вы хотите клонировать вместе с индексами. Единственное, что вам нужно, это переименовать индексы (если требуется).
Ответ 6
После того, как я попробовал решение выше, я придумываю свой собственный путь.
Мое решение немного ручное и нуждается в СУБД.
Сначала экспортируйте данные.
Во-вторых, откройте данные экспорта.
В-третьих, замените старое имя таблицы новым именем таблицы.
В-четвертых, измените все имя триггера в данных (я использую MySQL и выдает ошибку, когда я не меняю имя триггера).
В-пятых, импортируйте отредактированные данные SQL в базу данных.
Ответ 7
Лучший способ дублировать таблицу - использовать только оператор 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
Ответ 8
Развивая этот ответ, можно использовать хранимую процедуру:
CALL duplicate_table('tableName');
Что приведет к дублированию таблицы с именем tableName_20181022235959
Если 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 ;
Ответ 9
Попробуй это:
'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 столбца из старой таблицы и создал новую таблицу.
Ответ 10
ДЛЯ MySQL
CREATE TABLE newtable LIKE oldtable ;
INSERT newtable SELECT * FROM oldtable ;
ДЛЯ MSSQL
Используйте MyDatabase
:
Select * into newCustomersTable from oldCustomersTable;
Этот SQL используется для копирования таблиц, здесь содержимое oldCustomersTable будет скопировано в newCustomersTable
.
Убедитесь, что newCustomersTable
не существует в базе данных.