สร้างตารางชั่วคราวในคำสั่ง SELECT โดยไม่มี CREATE TABLE แยกต่างหาก


494

เป็นไปได้หรือไม่ที่จะสร้างตารางชั่วคราว (เซสชันเท่านั้น) จากคำสั่ง select โดยไม่ต้องใช้คำสั่งสร้างตารางและระบุแต่ละประเภทคอลัมน์? ฉันรู้ว่าตารางที่ได้รับมีความสามารถในเรื่องนี้ แต่มันเป็น super-temporary (statement-only) และฉันต้องการใช้ซ้ำ

มันจะประหยัดเวลาถ้าฉันไม่ต้องเขียนคำสั่งสร้างตารางและทำให้รายการคอลัมน์และรายการประเภทตรงกัน

คำตอบ:


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

จากคู่มือที่พบได้ที่http://dev.mysql.com/doc/refman/5.7/en/create-table.html

คุณสามารถใช้คำสำคัญชั่วคราวเมื่อสร้างตาราง ตารางชั่วคราวจะปรากฏเฉพาะกับเซสชันปัจจุบันเท่านั้นและจะลดลงโดยอัตโนมัติเมื่อปิดเซสชัน ซึ่งหมายความว่าสองเซสชันที่แตกต่างกันสามารถใช้ชื่อตารางชั่วคราวเดียวกันโดยไม่ขัดแย้งกันหรือมีตารางที่ไม่ใช่ชั่วคราวที่มีอยู่ในชื่อเดียวกัน (ตารางที่มีอยู่ถูกซ่อนไว้จนกว่าตารางชั่วคราวจะถูกลบ) ในการสร้างตารางชั่วคราวคุณต้องมีสิทธิ์ในการสร้างตารางชั่วคราว


8
ที่สมบูรณ์แบบ! คอลัมน์ที่มีความยาวสูงสุดที่เหมาะสมและทั้งหมด! ฉันจะเพิ่มคำว่าดังนั้นtemporary create temporary table mytable as select ...
Bryan Field

5
@ imperium2335, create table t as select ... limit 0; alter table t engine=memory; insert into t select ...บางทีคุณควรพยายามต่อไปนี้: หรือบางทีคุณสามารถเปลี่ยน "เครื่องมือเริ่มต้นของตารางใหม่" ฉันคิดว่าสิ่งนี้สามารถทำได้ในตัวแปรระดับเซสชั่น ยังดีกว่าใช้ปุ่มถามคำถามที่มุมบนขวา
สนามไบรอัน

10
ไม่จำเป็นต้องทราบเกี่ยวกับชื่อคอลัมน์และประเภทซึ่งเป็นเหตุผลของผู้ถามที่ต้องการหลีกเลี่ยงการใช้สร้างตาราง
psparrow

30
คุณสามารถใช้มันเช่นนี้CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1หากคุณไม่ต้องการคัดลอกข้อมูลเพียงแค่โครงสร้าง
dzona

1
คุณหมายถึงอะไรในเซสชั่น?
Saurabh Chandra Patel

137

นอกเหนือจากคำตอบของ psparrowหากคุณต้องการเพิ่มดัชนีในตารางชั่วคราวของคุณ:

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

มันยังใช้งานได้กับ PRIMARY KEY


3
Engine = หน่วยความจำสามารถใช้ด้วยไวยากรณ์เช่นกันได้หรือไม่
DarkSide

6
@DarkSide ใช่ Engine = MEMORY สามารถใช้งานได้เช่นกัน ดูตัวอย่างต่อไปนี้: blog.cnizz.com/2010/11/24/…
RafaSashi

1
อะไรคือข้อแตกต่างระหว่าง MyISAM และเอ็นจิ้นหน่วยความจำ? ประโยชน์ของหน่วยความจำคืออะไร?
yeahman

63

ใช้ไวยากรณ์นี้:

CREATE TEMPORARY TABLE t1 (select * from t2);

1
นั่นเป็นวัตถุประสงค์เพิ่มเติมสำหรับการคัดลอกข้อมูล! ที่ดี!
Rafael Gomes Francisco



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.