【问题标题】:Create a temporary table in a SELECT statement without a separate CREATE TABLE在没有单独的 CREATE TABLE 的 SELECT 语句中创建临时表
【发布时间】:2024-01-08 11:54:01
【问题描述】:

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

如果我不必编写创建表命令并保持列列表和类型列表匹配,这将节省时间。

【问题讨论】:

    标签: mysql select temp-tables create-table derived-table


    【解决方案1】:
    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 表仅对当前会话可见,并在会话关闭时自动删除。这意味着两个不同的会话可以使用相同的临时表名称,而不会相互冲突或与现有的同名非临时表冲突。 (在删除临时表之前,现有表是隐藏的。)要创建临时表,您必须具有 CREATE TEMPORARY TABLES 权限。

    【讨论】:

    • 完美!具有最佳最大长度的列等等!我添加了单词temporary 所以create temporary table mytable as select ...
    • @imperium2335,也许您应该尝试以下操作:create table t as select ... limit 0; alter table t engine=memory; insert into t select ...。或者,也许您可​​以更改“新表的默认引擎”。我想这可以在会话级变量中完成。更好的是,使用右上角的按钮。
    • 它不需要知道列名和类型,这是提问者想要避免使用 Create Table 的原因。
    • 你可以这样使用CREATE TEMPORARY TABLE IF NOT EXISTS table2 LIKE table1如果你不想复制数据,只是结构
    • 会话是什么意思?
    【解决方案2】:

    除了 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

    【讨论】:

    • Engine=Memory 也可以用于这种语法吗?
    • @DarkSide 是的 ENGINE=MEMORY 也可以使用。请参阅以下示例:blog.cnizz.com/2010/11/24/…
    • MyISAM 和内存引擎有什么区别?记忆有什么好处?
    • @yeahman MyISAM 引擎将数据存储在磁盘中,但内存引擎将其保存在 RAM 中。 P.S:内存引擎不支持transactions,仅支持表级锁定...阅读更多:dba.stackexchange.com/questions/1811/…
    【解决方案3】:

    使用这个语法:

    CREATE TEMPORARY TABLE t1 (select * from t2);
    

    【讨论】:

    • 复制数据更客观!太好了!
    【解决方案4】:

    引擎必须在选择之前:

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

    【讨论】:

      【解决方案5】:

      当表包含BLOB/TEXT 列时,不支持ENGINE=MEMORY

      【讨论】:

        【解决方案6】:

        据我了解,如果您在 phpMyAdmin 之类的东西中使用 SELECT 语句,它将在临时表上工作,但在 SELECT 之后,临时表将消失。这意味着首先准确设置您想要对其执行的操作,并且在您更改数据的“操作”语句(删除、更新)完成之前不要查看任何结果。

        【讨论】: