Trong MySQL, làm thế nào để sao chép nội dung của một bảng này sang một bảng khác trong cùng một cơ sở dữ liệu?


118

Tôi mới sử dụng MySQL. Tôi muốn sao chép nội dung của bảng này sang bảng khác trong cùng một cơ sở dữ liệu. Về cơ bản, tôi muốn chèn vào một bảng từ một bảng khác. Có cách nào dễ dàng để làm điều này?

Câu trả lời:


184

INSERT INTO TARGET_TABLE SELECT * FROM SOURCE_TABLE;

CHỈNH SỬA: hoặc nếu các bảng có cấu trúc khác nhau, bạn cũng có thể:

INSERT INTO TARGET_TABLE (`col1`,`col2`) SELECT `col1`,`col2` FROM SOURCE_TABLE;

CHỈNH SỬA: để hạn chế điều này ..

INSERT INTO TARGET_TABLE (`col1_`,`col2_`) SELECT `col1`,`col2` FROM SOURCE_TABLE WHERE `foo`=1

Điều gì sẽ xảy ra nếu ai đó muốn thực hiện các thao tác chèn trong bảng nguồn trong khi chạy truy vấn này? nó có khóa hoạt động chèn hay không?
Lawakush Kurmi

135

Nếu bảng không tồn tại, bạn có thể tạo một bảng với cùng một lược đồ như sau:

CREATE TABLE table2 LIKE table1;

Sau đó, để sao chép dữ liệu qua:

INSERT INTO table2 SELECT * FROM table1

1
Tôi tìm thấy mã này SELECT * INTO newTable FROM sourceTabletrong w3school , tại sao nó không được làm việc trongMySQL
Kasun Siyambalapitiya

@KasunSiyambalapitiya SELECT ... INTOcó nghĩa là xuất một bảng sang tệp đầu ra hoặc thành các biến; không trực tiếp vào một bảng. Xem dev.mysql.com/doc/refman/5.7/en/select-into.html
Doktor J

@Kasun Siyambalapitiya rằng trang w3school dành cho một SQL khác, không dành cho MySQL. w3schools hiện có báo cáo lỗi, nếu bạn tìm thấy sự cố, hãy báo cáo trên trang web của họ để hỗ trợ cung cấp kiến ​​thức chính xác.
Nightwolf

27

Nếu table1 lớn và bạn không muốn khóa nó trong suốt quá trình sao chép, bạn có thể thực hiện kết xuất và tải thay thế:

CREATE TABLE table2 LIKE table1;

SELECT * INTO OUTFILE '/tmp/table1.txt' FROM table1;
LOAD DATA INFILE '/tmp/table1.txt' INTO TABLE table2;

Tôi đã thử kết xuất trên RDS, sử dụng giải pháp stackoverflow.com/a/9536680/351903 . Tệp đã được tạo nhưng nó vẫn ở kích thước 0 trong một thời gian dài. Ngoài ra, khi kiểm tra show processlist, tôi không thể thấy bất kỳ truy vấn nào đang chạy. Không chắc chắn vấn đề là gì.
Sandeepan Nath

15

Điều này đã làm việc cho tôi,

CREATE TABLE newtable LIKE oldtable;

Sao chép bảng mới với bảng cũ

INSERT newtable SELECT * FROM oldtable;

Sao chép tất cả dữ liệu hàng vào bảng mới.

Cảm ơn bạn


10

Nếu bạn muốn tạo và sao chép nội dung trong một lần chụp, chỉ cần sử dụng CHỌN:

TẠO BẢNG new_tbl CHỌN * TỪ orig_tbl;


4
+1 - mặc dù bảng mới sẽ không có định nghĩa chỉ mục từ bảng đầu tiên. Phương pháp "tạo ... như ..." cũng sẽ sao chép các định nghĩa chỉ mục.
Martin

2

Điều này đã làm việc cho tôi. Bạn có thể làm cho câu lệnh SELECT phức tạp hơn, với mệnh đề WHERE và LIMIT.

Trước tiên, sao chép bảng lớn của bạn (không có dữ liệu), chạy truy vấn sau, sau đó cắt bớt bảng lớn hơn.

INSERT INTO table_small (SELECT * FROM table_large WHERE column = 'value' LIMIT 100)

Siêu đơn giản. :-)


0
CREATE TABLE target_table SELECT * FROM source_table;

Nó chỉ tạo một bảng mới với cấu trúc giống như bảng nguồn và cũng sao chép tất cả các hàng từ source_table vào target_table.

CREATE TABLE target_table SELECT * FROM source_table WHERE condition;

Nếu bạn cần sao chép một số hàng vào target_table, thì hãy áp dụng một điều kiện bên trong mệnh đề where


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.