在SELECT语句中创建临时表,无需单独创建表格

570

在不使用create table语句并指定每个列类型的情况下,是否可以从select语句创建一个临时(仅在会话期间存在)表?我知道派生表是有这个能力的,但它们是超级临时的(仅限于语句),我希望能够重复使用。

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

6个回答

896
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
太好了!列的最大长度都是最佳的!我加了一个词“temporary”,所以现在是“create temporary table mytable as select ...”。 - 700 Software
5
@imperium2335,也许你可以尝试以下方式:“创建表t,并选择… limit 0;”,然后将表t的引擎更改为内存型,并插入所需数据。或者,你可以更改“新表的默认引擎”。我想这可以在会话级变量中完成。最好的方法是使用右上角的“提问”按钮。 - 700 Software
11
回答者希望避免使用"创建表"功能,因为这需要了解列名和数据类型。然而,这并非必需,可以通过其他方式完成。 - psparrow
42
如果您不想复制数据,只想保留表结构,可以像这样使用语句CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1 - dzona
3
"session" 的意思是什么? - Saurabh Chandra Patel
显示剩余8条评论

156

除了 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 也可以使用。请参考以下示例:http://blog.cnizz.com/2010/11/24/mysql-temporary-tables-example-optimizing-applications-with-temp-tables/ - RafaSashi
1
MyISAM 和 Memory 引擎有什么区别?Memory 的好处是什么? - yeahman
1
@yeahman,MyISAM引擎将数据存储在磁盘中,而内存引擎则将其保留在RAM中。顺便说一下:内存引擎不支持“事务”,仅支持表级锁定...阅读更多:https://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the-memory-storage-engine-in-mysql/1812 - parse

68

请使用以下语法:

CREATE TEMPORARY TABLE t1 (select * from t2);

1
这更客观地复制数据!太棒了! - Rafael Gomes Francisco

59

引擎必须放在选择器之前:

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

44

ENGINE=MEMORY 不支持包含 BLOB/TEXT 列的表格


1
据我理解,如果你在像phpMyAdmin这样的工具中使用SELECT语句,则可以在临时表上运行它,但是在执行完SELECT语句后,临时表将消失。这意味着首先要准确设置想要使用临时表做什么,并且在完成更改数据的“操作”语句(DELETE、UPDATE)之前不要查看任何结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接