【问题标题】:Is there a way to create a temporary table in SQL that deletes right after the query finishes? [duplicate]有没有办法在 SQL 中创建一个在查询完成后立即删除的临时表? [复制]
【发布时间】:2017-03-31 05:01:42
【问题描述】:

我正在处理一个复杂的查询。它涉及几个表。

创建一个新表然后简单地从中查询对我很有帮助。但是,这是一个共享数据库,我不想创建一个新表,尤其是当我不打算专门使用该表时。 (我只是希望它作为我查询的垫脚石)

是否可以仅为 1 个查询创建一个表,该表在查询完成时立即删除? (即临时表)

【问题讨论】:

标签: sql postgresql pgadmin


【解决方案1】:

使用关键字temporary,临时表仅在您当前的连接中可见,并在您断开连接后丢弃。

另一种方法是创建一个表并在不需要时自行删除表

【讨论】:

    【解决方案2】:

    您可以使用临时表,它会在创建它们的会话结束时自行删除(而不是在查询完成后,如您所说)。不过,您始终可以在操作结束时手动删除它。

    如果您想创建这样的表作为查询的结果,那么这是要根据您的需要扩展的示例:

    CREATE TEMP TABLE tmp_table_name AS ( SELECT 1 AS col1 );
    

    但我认为您可能正在寻找 CTE 而不是表格,因为您说您打算只使用一次。考虑一下:

    WITH tmp_table AS ( SELECT 1 AS col1 )
    SELECT *
    FROM tmp_table
    ...
    

    【讨论】:

      【解决方案3】:

      你也可以做动态查询的结果也是一个表

       select *  from (select col1, col2, col3  
                      from my_complex_table 
                      ... ) t1 
      

      【讨论】:

        【解决方案4】:

        当然。使用CREATE TEMPORARY TABLE:

        => CREATE TEMPORARY TABLE secret_table(id BIGSERIAL, name text);
        
        => INSERT INTO secret_table(name) VALUES ('Good day');
        INSERT 0 1
        
        => INSERT INTO secret_table(name) VALUES ('Good night');
        INSERT 0 1
        
        => SELECT * FROM secret_table;
         id |    name
        ----+------------
          1 | Good day
          2 | Good night
        (2 rows)
        

        但在重新连接时:

        psql (9.5.4)
        Type "help" for help.
        
        => SELECT * FROM secret_table;
        ERROR:  relation "secret_table" does not exist
        LINE 1: SELECT * FROM secret_table;
        

        【讨论】:

        • ON COMMIT DROP 选项在事务中运行时也可能很有用。
        • 当然,这在单个事务范围内很有用;我认为 OP 的目标是会话范围。我认为在事务之间保持临时表稳定是很好的,并且在事务由于愚蠢的错字而结束时不要重新创建它。
        • 是的,我同意这是一个很少有用的选项,专为特定的工作流程量身定制。尽管如此,由于问题在细节上相当不清楚(实际上可能需要 CTE),因此可能值得一提。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 1970-01-01
        • 2014-03-16
        • 2018-09-15
        • 2020-05-29
        • 2016-05-09
        • 1970-01-01
        相关资源
        最近更新 更多