Để sao chép cấu trúc và dữ liệu từ bảng này sang bảng khác (có thể khác database) mà không dùng công cụ mysqldump, MySQL hỗ trợ cú pháp CREATE TABLE ... SELECT.
Cú pháp
CREATE TABLE db_moi.ten_bang_moi SELECT * FROM db_cu.ten_bang_cu;
Lệnh này:
- Tạo bảng mới với cấu trúc lấy từ kết quả SELECT (kiểu cột, NULL/NOT NULL).
- Chèn toàn bộ dữ liệu từ bảng cũ.
- Không sao chép: PRIMARY KEY, AUTO_INCREMENT, INDEX, FOREIGN KEY, DEFAULT, COMMENT, trigger, view, stored procedure.
Ví dụ minh họa
Tạo bảng gốc trong database sample:
mysql> USE sample; mysql> CREATE TABLE DemoTable101 (Id INT, Name VARCHAR(20)); mysql> INSERT INTO DemoTable101 VALUES (101,'Sam'), (102,'Bob'), (103,'David');
Sao chép sang database web:
mysql> CREATE TABLE web.DemoTable2 SELECT * FROM sample.DemoTable101; Query OK, 3 rows affected (0.71 sec)
Kiểm tra:
mysql> SELECT * FROM web.DemoTable2; +------+-------+ | Id | Name | +------+-------+ | 101 | Sam | | 102 | Bob | | 103 | David | +------+-------+
⚠️ Lưu ý quan trọng
- **Không copy khóa chính, index, auto_increment** – cần thêm lại sau:
ALTER TABLE web.DemoTable2 ADD PRIMARY KEY (Id), MODIFY Id INT AUTO_INCREMENT; - Chỉ copy **một bảng** mỗi lệnh. Để copy toàn database, lặp qua tất cả bảng hoặc dùng script.
- Với dữ liệu lớn,
mysqldumphoặcmysqlpumpvẫn nhanh và an toàn hơn (có lock, transaction, compression). - Cách này hữu ích cho: tạo bản sao test, staging, hoặc di chuyển một bảng đơn lẻ.
Biến thể: Chỉ copy cấu trúc (không dữ liệu)
CREATE TABLE db_moi.ten_bang_moi LIKE db_cu.ten_bang_cu;