我想在MySQL中复制一个表。什么是最快的方式?喜欢这个?
CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;
或
CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);
还是有另一种方式吗?
编辑:我担心重新创建索引,mysql如何继续执行这些语句?PS。不能使用像mysqldump这样的命令行工具,必须是即时的。
答案 0 :(得分:48)
这会立即复制表格的结构,但不会复制数据:
CREATE TABLE copy LIKE original;
这将创建original
表的所有索引。
它在mysql 5.1.39
中以这种方式工作。
答案 1 :(得分:42)
使用 MyISAM 表格的最快方式,而保留索引)以及其他存储引擎:
CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;
您希望禁用数据库加载的密钥,然后在最后重新创建密钥。
同样,对于 InnoDB :
SET unique_checks=0; SET foreign_key_checks=0;
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;
(正如评论中指出的那样。)
答案 2 :(得分:13)
来自manual:
“CREATE TABLE ... SELECT不会自动为您创建任何索引。这样做是为了使语句尽可能灵活。如果要在创建的表中包含索引,则应在SELECT之前指定这些索引。声明:“
CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
您可以使用CREATE TABLE LIKE
和CREATE TABLE SELECT
指定索引和数据类型(以避免数据类型转换)。哪一个更快将取决于您的设置。
答案 3 :(得分:8)
要使用索引和触发器进行复制,请执行以下两个查询:
CREATE TABLE newtable LIKE oldtable;
INSERT newtable SELECT * FROM oldtable;
要复制结构和数据,请使用以下内容:
CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
答案 4 :(得分:6)
create table mynewtable (select * from myoldtable)
是否可以在mysql中运行?如果是这样,你也可以试试。
答案 5 :(得分:5)
将结构和所有条目从一个表复制到另一个表(通过创建新表)的最佳方法是此查询......
<强> CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;
强>
答案 6 :(得分:3)
答案 7 :(得分:2)
如果您使用的是MyISAM,您还可以复制和重命名单个文件。 .MYD,.MYI,后端的.FRM文件
答案 8 :(得分:1)
也许你可以看看SHOW CREATE TABLE
。
采取的步骤:
转到phpmyadmin
转到SQL
执行此查询
SHOW CREATE TABLE `the_old_table`;
结果是一个完整的CREATE TABLE语句。编辑查询,直到您满意为止。
资源: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html
答案 9 :(得分:0)
CREATE TABLE copy SELECT * FROM original;
是快速的方式,但可能不是索引的最快原因。