Tạo bảng tạm thời trong câu lệnh CHỌN mà không có BẢNG TẠO riêng


494

Có thể tạo bảng tạm thời (chỉ phiên) từ câu lệnh chọn mà không cần sử dụng câu lệnh tạo bảng và chỉ định từng loại cột không? Tôi biết các bảng dẫn xuất có khả năng này, nhưng các bảng này là siêu tạm thời (chỉ có câu lệnh) và tôi muốn sử dụng lại.

Sẽ tiết kiệm thời gian nếu tôi không phải viết lệnh tạo bảng và giữ danh sách cột và danh sách loại khớp với nhau.

Câu trả lời:


789
CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)

Từ hướng dẫn tìm thấy tại http://dev.mysql.com/doc/refman/5.7/en/create-table.html

Bạn có thể sử dụng từ khóa TẠM THỜI khi tạo bảng. Bảng TẠM THỜI chỉ hiển thị cho phiên hiện tại và được tự động loại bỏ khi phiên đóng cửa. Điều này có nghĩa là hai phiên khác nhau có thể sử dụng cùng một tên bảng tạm thời mà không xung đột với nhau hoặc với bảng không TẠM THỜI hiện có cùng tên. (Bảng hiện có bị ẩn cho đến khi bảng tạm thời bị hủy.) Để tạo các bảng tạm thời, bạn phải có đặc quyền TẠO TẠM THỜI TẠM THỜI.


8
Hoàn hảo! Cột với maxlength tối ưu và tất cả! Tôi đã thêm từ temporarynhư vậy create temporary table mytable as select ....
Trường Bryan

5
@ invium2335, Có lẽ bạn nên thử như sau : create table t as select ... limit 0; alter table t engine=memory; insert into t select .... Hoặc, có lẽ bạn có thể thay đổi "công cụ mặc định của các bảng mới". Tôi tưởng tượng điều này có thể được thực hiện trong một biến cấp phiên. Tốt hơn hết, hãy sử dụng nút Hỏi Câu hỏi ở phía trên bên phải.
Trường Bryan

10
Nó không yêu cầu biết về tên và loại cột, đó là lý do người hỏi muốn tránh sử dụng Tạo bảng.
psparrow

30
bạn có thể sử dụng nó như thế này CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1nếu bạn không muốn sao chép dữ liệu, chỉ cần cấu trúc
dzona

1
bạn có ý nghĩa gì bởi phiên?
Saurabh Chandra Patel

137

Ngoài câu trả lời của psparrow nếu bạn cần thêm một chỉ mục vào bảng tạm thời của mình, hãy làm:

CREATE TEMPORARY TABLE IF NOT EXISTS 
  temp_table ( INDEX(col_2) ) 
ENGINE=MyISAM 
AS (
  SELECT col_1, coll_2, coll_3
  FROM mytable
)

Nó cũng hoạt động với PRIMARY KEY


3
Engine = Memory có thể được sử dụng quá với cú pháp như vậy không?
DarkSide

6
@DarkSide Có ĐỘNG CƠ = BỘ NHỚ cũng có thể được sử dụng. Xem ví dụ sau: blog.cnizz.com/2010/11/24/ Lời
RafaSashi

1
sự khác biệt giữa MyISAM và Memory engine là gì? lợi ích của bộ nhớ là gì?
yeahman

63

Sử dụng cú pháp này:

CREATE TEMPORARY TABLE t1 (select * from t2);

1
Đó là mục tiêu hơn cho dữ liệu sao chép! Tuyệt quá!
Rafael Gomes Francisco

54

Động cơ phải được chọn trước:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)


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.