Giới thiệu
MySQL cho phép tạo bảng mới từ kết quả của một VIEW (hoặc bất kỳ SELECT nào) bằng cú pháp CREATE TABLE new_table AS SELECT * FROM view_name (hoặc CREATE TABLE new_table SELECT ...).
Ví dụ thực hành
1. Tạo bảng gốc DemoTable830
mysql> CREATE TABLE DemoTable830 (Name VARCHAR(100));
2. Chèn dữ liệu
mysql> INSERT INTO DemoTable830 VALUES ('Chris'),('Robert'),('David'),('Mike');
3. Tạo View
mysql> CREATE VIEW table_view AS SELECT * FROM DemoTable830;
4. Tạo bảng mới từ View
mysql> CREATE TABLE DemoTable831 SELECT * FROM table_view;
5. Kết quả: DemoTable831 có y hệt dữ liệu View
+--------+
| Name |
+--------+
| Chris |
| Robert |
| David |
| Mike |
+--------+
Đặc điểm của CREATE TABLE ... SELECT
- Tạo bảng mới với cấu trúc (cột, kiểu dữ liệu) suy ra từ SELECT.
- Sao chép dữ liệu ngay lập tức.
- Không sao chép: Index, Primary Key, Foreign Key, AUTO_INCREMENT, DEFAULT, COMMENT, Trigger, Partition.
- Cần thêm lại PK/AUTO_INCREMENT sau nếu cần:
ALTER TABLE DemoTable831 ADD Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
So sánh với CREATE TABLE LIKE
| Câu lệnh | Sao chép cấu trúc | Sao chép dữ liệu | Sao chép Index/PK/FK |
|---|---|---|---|
CREATE TABLE t2 LIKE t1 | Có | Không | Có |
CREATE TABLE t2 SELECT * FROM t1 | Từ SELECT | Có | Không |
Ứng dụng
- Backup nhanh cấu trúc + dữ liệu:
CREATE TABLE backup_20240101 SELECT * FROM orders; - Tạo bảng tạm cho báo cáo phức tạp (materialized view thủ công).
- Di chuyển dữ liệu giữa database:
CREATE TABLE db2.t SELECT * FROM db1.t; - Ép kiểu cột:
CREATE TABLE t2 SELECT CAST(col AS UNSIGNED) AS col FROM t1;
Lưu ý
- Cần quyền
CREATE TABLEvàSELECTtrên view/bảng nguồn. - View có thể phức tạp (JOIN, GROUP BY) — bảng mới sẽ chứa kết quả phẳng (flattened).
- Không tạo Foreign Key tự động → cần
ALTER TABLEsau.