在没有单独的CREATE TABLE的SELECT语句中创建临时表


494

是否可以通过select语句创建一个临时(仅会话)表,而无需使用create table语句并指定每个列类型?我知道派生表可以做到这一点,但是它们是超临时的(仅用于陈述),我想重用。

如果我不必编写create table命令并保持列列表和类型列表匹配,则可以节省时间。

Answers:


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

从位于http://dev.mysql.com/doc/refman/5.7/en/create-table.html的手册中

您可以在创建表时使用TEMPORARY关键字。TEMPORARY表仅对当前会话可见,并且在关闭会话时会自动将其删除。这意味着两个不同的会话可以使用相同的临时表名称,而不会彼此冲突或与现有的具有相同名称的非TEMPORARY表冲突。(在删除临时表之前,现有表一直处于隐藏状态。)要创建临时表,您必须具有CREATE TEMPORARY TABLES特权。


8
完善!具有最佳maxlength和所有长度的列!我说这个词temporary如此create temporary table mytable as select ...
布莱恩·菲尔德

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 2014年

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
引擎=内存也可以使用这种语法吗?
DarkSide

6
@DarkSide是ENGINE = MEMORY也可以使用。参见以下示例:blog.cnizz.com/2010/11/24/…–
RafaSashi

1
MyISAM和内存引擎有什么区别?记忆的好处是什么?
yeahman


54

引擎必须在选择之前:

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


0
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.