Cách nhanh nhất để sao chép một bảng trong mysql?


82

Tôi muốn sao chép một bảng trong MySQL. Cách nhanh nhất là gì? Như thế này?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

hoặc là

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

Hoặc là có một cách khác?

CHỈNH SỬA: Tôi lo lắng về việc các chỉ mục được tạo lại, làm thế nào để mysql tiến hành thực hiện các câu lệnh này?

Tái bút. không thể sử dụng các công cụ dòng lệnh như mysqldump, phải luôn hoạt động.

Câu trả lời:


50

Thao tác này sao chép cấu trúc của bảng ngay lập tức, nhưng không sao chép dữ liệu:

CREATE TABLE copy LIKE original;

Điều này tạo ra tất cả các chỉ mục mà originalbảng có.

Nó hoạt động theo cách này trong mysql 5.1.39.


3
Tuy nhiên, nó sẽ không sao chép các trình kích hoạt.
ursitesion

3
Lưu ý, điều này cũng sẽ không sao chép các ràng buộc khóa ngoại.
Omer Sabic

47

Cách nhanh nhất sử dụng bảng MyISAM trong khi bảo toàn chỉ mục ) và có thể là các công cụ lưu trữ khác là:

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

Bạn muốn tắt các khóa của mình để tải cơ sở dữ liệu và sau đó tạo lại các khóa ở cuối.

Tương tự, đối với InnoDB :

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(Như đã chỉ ra trong các bình luận.)


1
Thật kỳ lạ. INSERT với các khóa mất 36 phút và phương pháp này mất 10 + 26 phút (chèn + thay đổi). 6 chỉ mục, 28 bản ghi M, Win 7 x64, RAM 8GB.
Per Lindberg

PHÍM BẬT gây ra "bảng sửa chữa". Kiểm tra danh sách quy trình của bạn theo cách nào mà điều này xảy ra. Có hai loại: 1. bảng sửa chữa với keycache 2. bảng sửa chữa bằng cách sắp xếp Loại thứ hai nếu cách nhanh và sẽ chỉ được sử dụng nếu myisam_max_sort_file_size đủ lớn. dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
Lopo

ALTER TABLE table DISABLE/ENABLE KEYSkhông hoạt động trong InnoDB và đưa ra cảnh báo bên dưới Table storage engine for 'table' doesn't have this option.
Amil Waduwawara

1
để sử dụng InnoDB SET unique_checks=0; SET foreign_key_checks=0;chèn mã SQL đâySET unique_checks=1; SET foreign_key_checks=1;
tuku

13

Từ sách hướng dẫn :

"TẠO BẢNG ... SELECT không tự động tạo bất kỳ chỉ mục nào cho bạn. Điều này được thực hiện có chủ ý để làm cho câu lệnh linh hoạt nhất có thể. Nếu bạn muốn có các chỉ mục trong bảng đã tạo, bạn nên chỉ định những chỉ mục này trước câu lệnh SELECT:"

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

Bạn có thể chỉ định các chỉ số và kiểu dữ liệu (để tránh chuyển đổi kiểu dữ liệu) trong cả hai CREATE TABLE LIKECREATE TABLE SELECT. Cái nào nhanh hơn sẽ phụ thuộc vào thiết lập của bạn.


9

Để sao chép với các chỉ mục và trình kích hoạt, hãy thực hiện 2 truy vấn sau:

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

Để chỉ sao chép cấu trúc và dữ liệu, hãy sử dụng cái này:

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

Không nên INSERT INTOthay vì INSERT?
giordano

6

create table mynewtable (select * from myoldtable)hoạt động trong mysql không? Nếu vậy bạn cũng có thể thử.


5

Cách tốt nhất để sao chép cấu trúc và tất cả các mục từ bảng này sang bảng khác (bằng cách tạo bảng mới) là truy vấn này ...

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


3

Hãy thử SELECT INTOvà sử dụng một biến số như một biến.

Trước tiên, bạn sẽ phải tạo bảng nhận để có cấu trúc giống như bảng nguồn.

Điều tốt nhất là, nó nội bộ nên rất nhanh. Tuy nhiên, bạn sẽ mất các chỉ mục của mình.


Chọn vào không được hỗ trợ bởi mySQL
Draco Ater

@Draco Ater - Đúng vậy. Nó chỉ sử dụng các biến.
amphetamachine,

2
bạn có thể cung cấp một ví dụ? Vì tôi nghĩ rằng các biến sẽ chỉ giữ giá trị cuối cùng được đọc bởi vùng chọn, chứ không phải tất cả các giá trị trong bảng. Miễn là bạn không sử dụng con trỏ và không muốn sao chép các bảng có nhiều hơn một hàng, giải pháp này hoàn toàn không hoạt động.
ưa thíchPants

2

nếu bạn đang sử dụng MyISAM, bạn cũng có thể sao chép và đổi tên các tệp trực quan. Các tệp .MYD, .MYI, .FRM trong phần phụ trợ


1

Có lẽ bạn có thể xem qua SHOW CREATE TABLE.

Các bước thực hiện:

  • Đi tới phpmyadmin

  • Chuyển đến SQL

Thực thi truy vấn này

SHOW CREATE TABLE `the_old_table`;
  • Nhấp vào tùy chọn Chọn "Toàn văn" và nhấn Đi.

Kết quả là một câu lệnh CREATE TABLE đầy đủ. Chỉnh sửa truy vấn cho đến khi bạn hài lòng.

Tài nguyên: http://dev.mysql.com/doc/refman/5.7/en/show-create-table.html


0
CREATE TABLE copy SELECT * FROM original;

Là một cách nhanh chóng nhưng có thể không phải là nguyên nhân nhanh nhất của các chỉ mục.


Vui lòng chỉnh sửa câu trả lời của bạn và định dạng nó đúng cách để có thể đọc được.
Neeku

1
Câu lệnh này không sao chép chỉ mục cũng như trình kích hoạt được liên kết với bảng này.
ursitesion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.