在mysql中复制表的最快方法?

Ano*_*non 82 mysql sql

我想在MySQL中复制一个表.什么是最快的方式?像这样?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;
Run Code Online (Sandbox Code Playgroud)

要么

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);
Run Code Online (Sandbox Code Playgroud)

还是有另一种方式?

编辑:我担心重新创建索引,mysql如何继续执行这些语句?

PS.不能使用像mysqldump这样的命令行工具,必须是即时的.

cet*_*ras 50

这会立即复制表的结构,但不会复制数据:

CREATE TABLE copy LIKE original;
Run Code Online (Sandbox Code Playgroud)

这将创建original表所具有的所有索引.

它在mysql中以这种方式工作5.1.39.

  • 但是,它不会复制触发器. (3认同)
  • 注意,这也不会复制外键约束. (3认同)

ctb*_*own 44

使用MyISAM表同时保留索引的最快方式)以及其他存储引擎:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;
Run Code Online (Sandbox Code Playgroud)

您希望禁用数据库加载的密钥,然后在最后重新创建密钥.

同样,对于InnoDB:

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;
Run Code Online (Sandbox Code Playgroud)

(正如评论中所指出的那样.)

  • 对于 innodb 使用 ```SET unique_checks=0; SETforeign_key_checks=0;```在这里插入sql代码```SET unique_checks=1; 设置foreign_key_checks = 1;``` (2认同)

dna*_*irl 13

手册:

"CREATE TABLE ... SELECT不会自动为您创建任何索引.这样做是为了使语句尽可能灵活.如果要在创建的表中包含索引,则应在SELECT语句之前指定这些索引:"

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Run Code Online (Sandbox Code Playgroud)

您可以与两个指定索引和数据类型(以避免数据类型转换)CREATE TABLE LIKECREATE TABLE SELECT.哪一个更快将取决于您的设置.


Zig*_*612 8

要使用索引和触发器复制,请执行以下两个查询:

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;
Run Code Online (Sandbox Code Playgroud)

要复制结构和数据,请使用以下方法:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;
Run Code Online (Sandbox Code Playgroud)

  • 不应该是“INSERT INTO”而不是“INSERT”吗? (4认同)

Dra*_*ter 6

是否create table mynewtable (select * from myoldtable)在MySQL吗?如果是这样,你也可以尝试一下.


Ani*_*hal 5

将结构和所有条目从一个表复制到另一个表(通过创建新表)的最佳方法是此查询...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;


amp*_*ine 3

尝试一下SELECT INTO,并使用一个变量作为中间人。

首先,您必须创建接收表,使其具有与源表相同的结构。

最好的是,它是内部的,所以速度很快。不过,您会丢失索引。

  • 你能举个例子吗?因为我认为变量只会保存选择读取的最后一个值,而不是表中的所有值。只要您不使用游标并且不想复制具有多于一行的表,此解决方案就根本不起作用。 (2认同)