如何将 MySQL 表的数据、结构和索引复制或克隆或复制到新表?
这是我迄今为止发现的。
这将复制数据和结构,但不复制索引:
create table {new_table} select * from {old_table};
这将复制结构和索引,但不复制数据:
create table {new_table} like {old_table};
要使用索引和触发器进行复制,请执行以下 2 个查询:
CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;
要仅复制结构和数据,请使用此:
CREATE TABLE new_table AS SELECT * FROM old_table;
我以前问过这个:
Copy a MySQL table including indexes
除了上面的解决方案,您还可以使用 AS
使其成为一行。
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;
转到 phpMyAdmin 并选择您的原始表,然后在“将表复制到(database.table)”区域中选择“操作”选项卡。选择要复制的数据库并为新表添加名称。
https://i.stack.imgur.com/3tQzC.jpg
我发现了同样的情况,我采取的方法如下:
执行 SHOW CREATE TABLE <要克隆的表名> :这将为您提供要克隆的表的 Create Table 语法 通过更改表名来克隆表来运行 CREATE TABLE 查询。
这将创建要与索引一起克隆的表的精确副本。然后,您唯一需要的是重命名索引(如果需要)。
复制表的更好方法是仅使用 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 ;
祝你今天过得愉快!亚历克斯
要在没有来自不同数据库的数据的情况下复制表及其结构,请使用它。关于新的数据库 sql 类型
CREATE TABLE currentdatabase.tablename LIKE olddatabase.tablename
值得一提的是在尝试复制表之前检查表是否已经存在的重要性:
CREATE TABLE IF NOT EXISTS new_table LIKE old_table;
INSERT new_table
SELECT * FROM old_table;
正如前面的答案所说,这将复制表的结构、数据和所有相关对象。
请参阅MySql Tutorial:
扩展 this answer 可以使用存储过程:
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 ;
在我尝试了上面的解决方案之后,我想出了自己的方法。
我的解决方案有点手动,需要 DBMS。
首先,导出数据。
二、打开导出数据。
第三,用新表名替换旧表名。
第四,更改数据中的所有触发器名称(我使用MySQL,当我不更改触发器名称时会显示错误)。
第五,将您编辑的 SQL 数据导入数据库。
要创建表结构,请仅使用以下代码:
CREATE TABLE new_table LIKE current_table;
要将数据从表复制到另一个使用以下代码:
INSERT INTO new_table SELECT * FROM current_table;
简单克隆:它从另一个表创建一个表,而不考虑任何列属性和索引。
CREATE TABLE new_table SELECT * FROM original_table;
浅克隆:这只会基于原始表的结构创建一个空表
CREATE TABLE new_table LIKE original_table;
以下命令将基于原始表创建一个空表。
CREATE TABLE adminUsers LIKE users;
深度克隆:这意味着新表将具有现有表的每列和索引的所有属性。如果您想维护现有表的索引和属性,这非常有用。
CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table;
https://towardsdatascience.com/how-to-clone-tables-in-sql-dd29586ec89c
// To copy specific column data use this one:
CREATE TABLE ut_axis_existrec LIKE ut_karvy_annexure; // To create new table
INSERT INTO ut_axis_existrec
(funding_ac,micr_no, warrant_no,
amount,invname,mfundcode,funding_dt,status,remarks1,amc_remark,created_at)
SELECT
t1.funding_ac,
t1.micr_no,
t1.warrant_no,
t1.amount,
t1.invname,
t1.mfund_code,
t1.funding_dt,
t1.status,
t1.remarks1,
t1.created_at
from ut_axis_karvy
inner join
ut_axis_karvy_master as t2
on t1.micr_no = t2.micr_no;
尝试这个 :
`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 列并制作了一个新表。
为 MySQL
CREATE TABLE newtable LIKE oldtable ;
INSERT newtable SELECT * FROM oldtable ;
对于 MSSQL 使用 MyDatabase
:
Select * into newCustomersTable from oldCustomersTable;
此 SQL 用于复制表,这里 oldCustomersTable 的内容将被复制到 newCustomersTable
。
确保数据库中不存在 newCustomersTable
。
不定期副业成功案例分享
select *
将如何在大表中执行。AUTO_INCREMENT
值。