mysql에서 테이블을 복사하는 가장 빠른 방법은 무엇입니까?


82

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은 이러한 명령문을 어떻게 실행합니까?

추신. mysqldump와 같은 명령 줄 도구를 사용할 수 없으며 즉시 사용해야합니다.

답변:


50

이렇게하면 테이블 구조가 즉시 복사되지만 데이터는 복사되지 않습니다.

CREATE TABLE copy LIKE original;

이렇게하면 original테이블에있는 모든 인덱스가 생성됩니다 .

mysql에서 이런 식으로 작동합니다 5.1.39.


3
그러나 트리거를 복사하지는 않습니다.
ursitesion

3
이것은 또한 외래 키 제약 조건을 복사하지 않습니다.
Omer Sabic

47

인덱스보존하면서 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;

(댓글에서 지적했듯이.)


1
이상한. 키가있는 INSERT는 36 분이 걸렸고이 방법은 10 + 26 분 (삽입 + 변경)이 걸렸습니다. 6 개의 인덱스, 28M 레코드, Win 7 x64, 8GB RAM.
Per Lindberg

ENABLE KEYS는 "repair table"을 발생시킵니다. 이것이 발생하는 방식으로 프로세스 목록을 확인하십시오. 두 가지 종류가 있습니다. 1. 키 캐시로 테이블 복구 2. 정렬하여 테이블 복구 두 번째는 빠른 방법이고 myisam_max_sort_file_size가 충분히 큰 경우에만 사용됩니다. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo

ALTER TABLE table DISABLE/ENABLE KEYSInnoDB에서 작동하지 않으며 아래 경고를 제공합니다 Table storage engine for 'table' doesn't have this option.
Amil Waduwawara

1
innodb의 경우 SET unique_checks=0; SET foreign_key_checks=0;여기에 SQL 코드 삽입SET unique_checks=1; SET foreign_key_checks=1;
tuku

13

로부터 수동 :

"CREATE TABLE ... SELECT는 자동으로 인덱스를 생성하지 않습니다. 이는 명령문을 최대한 유연하게 만들기 위해 의도적으로 수행됩니다. 생성 된 테이블에 인덱스를 포함하려면 SELECT 문 앞에 다음을 지정해야합니다."

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

당신은 모두에 인덱스 및 데이터 유형 (데이터 타입 변환을 피하기 위해)를 지정할 수 있습니다 CREATE TABLE LIKECREATE TABLE SELECT. 어느 것이 더 빠른지 설정에 따라 다릅니다.


9

인덱스 및 트리거를 사용하여 복사하려면 다음 두 쿼리를 수행하십시오.

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

구조와 데이터 만 복사하려면 다음을 사용하십시오.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

INSERT INTO대신 해야하지 INSERT않습니까?
giordano는

6

create table mynewtable (select * from myoldtable)mysql 에서 작동 합니까 ? 그렇다면 당신도 시도 할 수 있습니다.


5

구조와 모든 항목을 한 테이블에서 다른 테이블로 복사하는 가장 좋은 방법은 다음 쿼리입니다.

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


3

을 시도 SELECT INTO하고 변수 를 중개자로 사용 하십시오 .

먼저 원본 테이블과 동일한 구조를 갖도록 수신 테이블을 만들어야합니다.

가장 좋은 점은 내부이기 때문에 빠르다는 것입니다. 그래도 색인을 잃게됩니다.


선택은 mySQL에서 지원되지 않습니다
Draco Ater

@Draco Ater-네, 그렇습니다. 변수 만 사용합니다.
amphetamachine

2
예를 들어 줄 수 있습니까? 왜냐하면 변수는 선택에서 읽은 마지막 값을 보유하지만 테이블의 모든 값을 보유하지는 않습니다. 커서를 사용하지 않고 둘 이상의 행이있는 테이블을 복사하지 않는 한이 솔루션은 전혀 작동하지 않습니다.
fancyPants

2

MyISAM을 사용하는 경우 개별 파일을 복사하고 이름을 바꿀 수도 있습니다. 백엔드의 .MYD, .MYI, .FRM 파일


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


0
CREATE TABLE copy SELECT * FROM original;

빠른 방법이지만 인덱스의 가장 빠른 원인은 아닐 수 있습니다.


답을 수정하고 읽을 수 있도록 올바른 형식을 지정하십시오.
Neeku

1
이 명령문은이 테이블과 연관된 인덱스 나 트리거를 복사하지 않습니다.
ursitesion
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.