MySQLテーブルのデータ、構造、およびインデックスを新しいテーブルにコピー、複製、または複製するにはどうすればよいですか?
これは私がこれまでに見つけたものです。
これはデータと構造をコピーしますが、インデックスはコピーしません:
create table {new_table} select * from {old_table};
これは構造とインデックスをコピーしますが、データはコピーしません:
create table {new_table} like {old_table};
MySQLテーブルのデータ、構造、およびインデックスを新しいテーブルにコピー、複製、または複製するにはどうすればよいですか?
これは私がこれまでに見つけたものです。
これはデータと構造をコピーしますが、インデックスはコピーしません:
create table {new_table} select * from {old_table};
これは構造とインデックスをコピーしますが、データはコピーしません:
create table {new_table} like {old_table};
回答:
インデックスとトリガーでコピーするには、次の2つのクエリを実行します。
CREATE TABLE newtable LIKE oldtable;
INSERT INTO newtable SELECT * FROM oldtable;
構造とデータだけをコピーするには、次のコードを使用します。
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
私は以前にこれを尋ねました:
select *が巨大なテーブルでどのように機能するかわからないので、私は尋ねています。
AUTO_INCREMENT値をコピーしません。
上記のソリューションとは別に、を使用ASして1行で作成できます。
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
create table {new_table} select * from {old_table};です。答えではなく、新しい情報を提供しません。
MySQLの方法:
CREATE TABLE recipes_new LIKE production.recipes;
INSERT recipes_new SELECT * FROM production.recipes;
テーブルを複製するより良い方法は、 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 ;
ごきげんよう!アレックス
この答えを拡張すると、ストアドプロシージャを使用できます。
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 ;
MySQLの場合
CREATE TABLE newtable LIKE oldtable ;
INSERT newtable SELECT * FROM oldtable ;
MSSQLの使用MyDatabase:
Select * into newCustomersTable from oldCustomersTable;
このSQLはテーブルのコピーに使用されnewCustomersTableます。ここではoldCustomersTableの内容がにコピーされます。がデータベースに存在しない
ことを確認しnewCustomersTable てください。