2010-07-19 53 views
433

Làm cách nào để sao chép/sao chép/sao chép dữ liệu, cấu trúc và chỉ mục của bảng MySQL sang bảng mới?Nhân đôi bảng MySQL, chỉ mục và dữ liệu

Đây là những gì tôi đã tìm thấy cho đến nay.

này sẽ sao chép các dữ liệu và cấu trúc, nhưng không phải là chỉ số:

create table {new_table} select * from {old_table}; 

này sẽ sao chép cấu trúc và lập chỉ mục, nhưng không phải là dữ liệu:

create table {new_table} like {old_table}; 
+2

thể trùng lặp của [chạy mysql tạo bảng bằng cách chọn khác và sao chép các chỉ số tự động] (http://stackoverflow.com/questions/2415855/run-mysql-create-table-by-select- khác-và-sao chép-chỉ số-tự động) –

Trả lời

970

Để sao chép với chỉ số và trình kích hoạt thực hiện 2 truy vấn sau:

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

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

CREATE TABLE tbl_new AS SELECT * FROM tbl_old; 

Tôi đã yêu cầu này trước:

Copy a MySQL table including indexes

+24

Trong trường hợp này, bạn nên gắn cờ câu hỏi mới là trùng lặp, thay vì sao chép câu trả lời. Tuy nhiên, bây giờ câu hỏi này đã nhận được nhiều sự chú ý hơn (và tốt hơn bằng văn bản và dễ tìm hơn), vì vậy tôi đã gắn cờ câu hỏi cũ của bạn như là một sự lừa dối của điều này. – TRiG

+5

Cần lưu ý rằng các phím nước ngoài chỉ vào bàn cũ sẽ cần phải được sao chép sang bàn mới (nếu bạn thay thế cũ) – George

+2

Điều này có hiệu quả cho các bảng lớn (hàng triệu bản ghi) không? .. Tôi hỏi vì tôi không biết làm thế nào 'select *' sẽ thực hiện trong các bảng lớn. – fguillen

38

Ngoài các giải pháp trên, bạn có thể sử dụng AS để làm cho nó trong một dòng.

CREATE TABLE tbl_new AS SELECT * FROM tbl_old; 
+21

Điều này sẽ không sao chép các chỉ mục và trình kích hoạt vì kết quả SELECT là một bảng tạm thời (chưa đặt tên) và không "mang" siêu dữ liệu của bảng nguồn. Hãy xem xét nếu bạn muốn sử dụng các chức năng, nó sẽ không có ý nghĩa. – chx

+1

Tôi đang tìm kiếm sao lưu bảng cấu trúc và di chuyển dữ liệu chỉ, do đó giảm chỉ mục/ràng buộc/v.v. vì vậy tôi có thể tạo lại chúng. Câu trả lời này thật tuyệt vời khi thấy Google gửi cho tôi ở đây. – Ellesedil

+0

đây chính xác là những gì anh ta đã đề cập trong câu hỏi: ** 'tạo bảng {new_table} chọn * từ {old_table};' ** không phải là câu trả lời và không cung cấp thông tin mới. – billynoah

-3

CHO MySQL

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

CHO MSSQL Sử dụng MyDatabase:

Select * into newCustomersTable from oldCustomersTable; 

SQL này được sử dụng để sao chép bảng, ở đây các nội dung của oldCustomersTable sẽ được sao chép vào newCustomersTable.
Đảm bảo rằng newCustomersTablekhông tồn tại trong cơ sở dữ liệu.

+3

Lỗi báo lỗi Lỗi SQL (3172): Biến không khai báo: 'newCustomerTable' – mikewasmike

+0

Bạn phải làm điều gì đó sai. Vì điều này sẽ làm việc 100%. Đọc trước khi bạn bỏ phiếu âm. Tham chiếu nội dung cho bạn. http://www.w3schools.com/sql/sql_select_into.asp – Krishneil

+1

Lưu ý rằng câu hỏi là về MySQL. Một số cú pháp SQL có thể không được hỗ trợ. – mikewasmike

1

Tôi thấy tình huống tương tự và cách tiếp cận mà tôi đã thực hiện như sau: 1. Thực hiện SHOW TẠO BẢNG: Điều này sẽ cung cấp cho bạn cú pháp Tạo bảng cho bảng mà bạn muốn sao chép 2. Chạy TẠO TẠO truy vấn bằng cách thay đổi tên bảng để sao chép bảng.

Điều này sẽ tạo bản sao chính xác của bảng mà bạn muốn sao chép cùng với Chỉ mục. Điều duy nhất bạn cần là đổi tên các chỉ mục (nếu cần).

2

MySQL Way

CREATE TABLE recipes_new LIKE production.recipes; INSERT recipes_new SELECT * FROM production.recipes; 
1

Sau khi thử các giải pháp trên. Tôi nghĩ ra cách riêng của mình.

Giải pháp của tôi một chút thủ công và cần DBMS.

Xuất dữ liệu lần đầu tiên.

giây mở dữ liệu xuất.

thay thế thứ ba tên bảng cũ bằng tên bảng mới.

thay đổi thứ tư tất cả các tên cò trong các dữ liệu (tôi sử dụng mysql và nó hiển thị lỗi khi tôi không thay đổi tên trigger)

thứ năm nhập dữ liệu sql chỉnh sửa của bạn vào cơ sở dữ liệu.

2

Đến phpMyAdmin và chọn bảng ban đầu của bạn sau đó chọn "Operations" tab trong 'Sao chép bảng vào (database.table)' vùng chọn cơ sở dữ liệu mà bạn muốn sao chép và thêm tên cho bảng mới của bạn.

copy table - phyMyAdmin Screenshot

Các vấn đề liên quan