PostgreSQL:臨時表

Ryan_Bai發表於2020-12-14

語法

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ( [
  { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE source_table [ like_option ... ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
  • GLOBAL和LOCAL在這個語法中是一樣的, 沒有分別, 但是在SQL標準中是不一樣的.

  • ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP 

    • PRESERVE ROWS 表示臨時表的資料在事務結束後保留.

    • DELETE ROWS 表示臨時表的資料在事務結束後truncate掉.

    • DROP 表示臨時表在事務結束後刪除.

    • 預設使用的是PRESERVE ROWS.

示例

  1. 臨時表在會話結束後會自動刪除(或者在事務結束後刪除 on commit drop). 

    1. 會話1 :

      pg9.2.0@db-172-16-3-150-> psql digoal digoal
      psql (9.2.0)
      Type "help" for help.
      digoal=> create temp table t(id int);
      CREATE TABLE
      digoal=> select relname,relnamespace,oid from pg_class where relname='t';
       relname | relnamespace |  oid  
      ---------+--------------+-------
       t       |        41192 | 41203
      (1 row)
      digoal=> select nspname from pg_namespace where oid=41192;
          nspname  
      -----------
       pg_temp_2
      (1 row)
    2. 退出會話1後重進, 臨時表已經被刪除了。

      digoal=> \q
      pg9.2.0@db-172-16-3-150-> psql digoal digoal
      psql (9.2.0)
      Type "help" for help.
      digoal=> select nspname from pg_namespace where oid=41192;
           
        nspname  
      -----------
       pg_temp_2
      (1 row)
      digoal=> select relname,relnamespace,oid from pg_class where relname='t';
       relname | relnamespace | oid 
      ---------+--------------+-----
      (0 rows)
  2. 每個會話中需要使用臨時表的話需要重新建立. 好處是不同的會話能夠使用同名但是不同結構的臨時表。

    1. 會話 1

      pg9.2.0@db-172-16-3-150-> psql digoal digoal
      psql (9.2.0)
      Type "help" for help.
      digoal=> create temp table t(id int);
      CREATE TABL
    2. 會話 2

      pg9.2.0@db-172-16-3-150-> psql digoal digoal
      psql (9.2.0)
      Type "help" for help.
      digoal=> create temp table t(id text,id2 int);
      CREATE TABLE
      digoal=> select relname,relnamespace,oid from pg_class where relname='t';
       relname | relnamespace |  oid  
      ---------+--------------+-------
       t       |        11194 | 41206
       t       |        41192 | 41209
      (2 rows)
      digoal=> select nspname from pg_namespace where oid in (11194, 41192);
       nspname  
      -----------
       pg_temp_1
       pg_temp_2
      (2 rows)
    3. 會話3

      pg9.2.0@db-172-16-3-150-> psql digoal digoal
      psql (9.2.0)
      Type "help" for help.
      digoal=> create temp table t(id text,id2 int,info text);
      CREATE TABLE
      digoal=> select relname,relnamespace,oid from pg_class where relname='t';
       relname | relnamespace |  oid  
      ---------+--------------+-------
       t       |        11194 | 41206
       t       |        41192 | 41209
       t       |        41215 | 41217
      (3 rows)
      digoal=> select nspname from pg_namespace where oid in (11194, 41192, 41215);
        nspname  
      -----------
       pg_temp_1
       pg_temp_2
       pg_temp_3
      (3 rows)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2742045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章