2010-05-19 37 views
5

Tôi muốn sao chép một bảng rất lớn, nhưng tôi không muốn sao chép hàng theo hàng. Có cách nào để sao chép nó không?Nhân bản bảng trong MYSQL mà không cần sao chép một hàng tại một thời điểm

Ví dụ, bạn có thể TRUNCATE w/o xóa dòng/hàng, vì vậy tôi đã tự hỏi nếu có cái gì đó tương tự để sao chép toàn bộ bảng

UPDATE: hàng bằng cách chèn hàng là rất đau đớn (vì 120M hàng) . Dù sao để tránh điều đó?

Trả lời

5

MySQL không còn có chức năng "bảng sao chép" đáng tin cậy nữa - nhiều lý do cho việc này liên quan đến cách dữ liệu được lưu trữ. Tuy nhiên, việc chèn hàng từng hàng bên dưới nhưng khá đơn giản:

CREATE TABLE `new_table` LIKE `old_table`; 
INSERT INTO `new_table` (SELECT * FROM `old_table`); 
+1

1 cho ninja'ing tôi. [cười] – pinkgothic

+0

ouch. Tôi có một cái bàn lớn, và hàng bằng cách chèn hàng là rất đau đớn –

+0

Tôi ghét điều đó! :) – AvatarKava

4

Bạn có thể sử dụng INSERT INTO ... SELECT.

+0

Thật không may, điều này sẽ không hoạt động cũng như câu trả lời @AvatarKava cung cấp, vì điều này sẽ không sao chép các thuộc tính như auto_increment ... –

+0

Mrh? Câu trả lời của chúng tôi là giống hệt nhau, ngoại trừ @ AvatarKava đề cập đến dòng tạo bảng mà tôi chỉ ngụ ý (đó cũng là lý do tại sao tôi upvoted họ), và tôi lần lượt liên kết với tài liệu. Nếu không, chúng tôi đang nói chính xác điều tương tự. o. @; – pinkgothic

1
INSERT INTO TABLE2 SELECT * FROM TABLE1 
+0

Thật không may, điều này sẽ không hoạt động cũng như câu trả lời @AvatarKava được cung cấp, vì điều này sẽ không sao chép các thuộc tính như auto_increment ... –

+0

Vâng, cách duy nhất để sao chép chúng là tái tạo chúng. không làm trò lừa. – modz0r

2

Nếu bạn đang sử dụng MyISAM, bạn có thể sao chép các tệp vật lý trên đĩa. Khởi động lại dịch vụ và bạn sẽ có bảng mới với các chỉ mục và mọi thứ giống nhau.

+1

Tôi đang sử dụng innodb. Điều đó có áp dụng không? –

+0

tiếc là không: ( – AvatarKava

+0

lý do tại sao không mặc dù? Tò mò! –

1

Không cần thiết để sao chép một bảng lớn; cuối cùng cơ sở dữ liệu có thể cần phải xây dựng lại nó. Trong InnoDB cách duy nhất là thực sự để xây dựng lại nó, có nghĩa là chèn ... chọn hoặc như vậy, tuy nhiên, với 120M hàng như nó sẽ xảy ra trong một giao dịch duy nhất, bạn có thể sẽ vượt quá kích thước của rollback khu vực, điều này sẽ khiến cho quá trình chèn bị lỗi.

mysqldump theo sau bằng cách đổi tên bảng gốc, sau đó khôi phục kết xuất sẽ hoạt động, vì mysqldump có thể gây ra cam kết mỗi hàng. Tuy nhiên nó sẽ chậm.

0

oracle:

Tạo bảng t như select * from original_table

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