在SELECT语句中创建临时表,而不使用单独的CREATE TABLE

Bry*_*eld 479 mysql select temp-tables derived-table create-table

是否可以在不使用create table语句并指定每个列类型的情况下从select语句创建临时(仅会话)表?我知道派生表能够做到这一点,但那些是超临时的(仅限语句),我想重用.

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

psp*_*row 770

CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT * FROM table1)
Run Code Online (Sandbox Code Playgroud)

来自http://dev.mysql.com/doc/refman/5.7/en/create-table.html上的手册

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

  • 你可以像这样使用`CREATE TEMPORARY TABLE IF NOT NOT EXISTS table2 LIKE table1`如果你不想复制数据,只需要结构 (27认同)
  • 它不需要知道列名和类型,这是提问者想要避免使用Create Table的原因. (10认同)
  • 完善!具有最佳最大长度的色谱柱!我添加了"临时"这个词,所以`创建临时表mytable作为select ...`. (8认同)
  • @ imperium2335,也许你应该尝试以下方法:`create table t as select ... limit 0; alter table t engine = memory; 插入到t select ...`.或者,也许您可​​以更改"新表的默认引擎".我想这可以在会话级变量中完成.更好的是,使用右上方的Ask Question按钮. (5认同)
  • 会话是什么意思? (3认同)

Raf*_*shi 132

除了psparrow的答案,如果你需要为临时表添加一个索引,请执行以下操作:

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

它也适用 PRIMARY KEY

  • @DarkSide是也可以使用ENGINE = MEMORY.请参阅以下示例:http://blog.cnizz.com/2010/11/24/mysql-temporary-tables-example-optimizing-applications-with-temp-tables/ (6认同)
  • Can Engine = Memory也可以使用这样的语法吗? (3认同)
  • MyISAM 和内存引擎有什么区别?记忆有什么好处? (2认同)
  • @yeahman MyISAM 引擎将数据存储在磁盘中,但内存引擎将其保存在 RAM 中。PS:内存引擎不支持“事务”,仅支持表级锁定...阅读更多:https://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the -mysql中的内存存储引擎/1812 (2认同)

riz*_*zon 63

使用以下语法:

CREATE TEMPORARY TABLE t1 (select * from t2);
Run Code Online (Sandbox Code Playgroud)


Cru*_*der 54

引擎必须在选择之前:

CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY 
as (select * from table1)
Run Code Online (Sandbox Code Playgroud)


Cri*_*ris 38

ENGINE=MEMORY表包含BLOB/ TEXTcolumns 时不支持