是否可以在不使用create table语句并指定每个列类型的情况下从select语句创建临时(仅会话)表?我知道派生表能够做到这一点,但那些是超临时的(仅限语句),我想重用。
如果我不必编写create table命令并保持列列表和类型列表匹配,那么可以节省时间。
答案 0 :(得分:748)
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权限。
答案 1 :(得分:130)
除 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
答案 2 :(得分:60)
使用以下语法:
CREATE TEMPORARY TABLE t1 (select * from t2);
答案 3 :(得分:53)
引擎必须在选择之前:
CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY
as (select * from table1)
答案 4 :(得分:37)
ENGINE=MEMORY
/ BLOB
列时, TEXT
不受支持
答案 5 :(得分:0)
CREATE TEMPORARY TABLE IF NOT EXISTS to_table_name AS (SELECT * FROM from_table_name)
答案 6 :(得分:0)
据我所知,如果您在 phpMyAdmin 之类的东西中使用 SELECT 语句,它可以在临时表上工作,但是在 SELECT 之后,临时表将消失。这意味着首先准确地设置您想用它做什么,并且在更改数据(删除、更新)的“操作”语句完成之前不要查看任何结果。