VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

临时表

功能描述

Vastbase在SQL Server兼容模式下支持以井号(#)开头的临时表。

临时表根据可见性的不同,分为本地临时表和全局临时表。

  • #table_name表示本地临时表:仅在当前会话中可见。

  • ##table_name表示全局临时表:在所有会话中都可见,且当前会话结束后元数据依然存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。

注意事项

  • 该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。
  • 临时表不支持分区表,列存表,不支持外键。
  • GUC参数max_active_global_temporary_table控制是否可以创建全局临时表,取值为0表示关闭全局临时表功能,取值大于0代表开启全局临时表功能。
  • 临时表的访问规则与普通表一致,其上可以创建索引等相关对象。

  • 本地临时表通过每个会话独立的以pg_temp_开头的schema来保证其只对当前会话可见,本地临时表不支持指定其schema。

    而全局临时表可以通过修改当前所在的schema,从而实现将临时表创建在指定schema下的目的,请参考示例3。需注意,以井号开头的临时表不支持通过schema_name.##table_name的方式指定schema。

语法格式

  • CREATE TABLE创建临时表:

    CREATE TABLE { #table_name | ##table_name } [ IF NOT EXISTS ]
    ( { column_name data_type [ column_constraint [ ... ] ] } )
    [ option [ ,... ] ];
    
  • SELECT INTO创建临时表:

    SELECT { * | cloumn_name [,...] } INTO { #new_table | ##new_table } FROM { #old_table | ##old_table };
    

除了table_name形式的不同,临时表的修改,更新与删除等其它语法均与普通表相同,请参考开发者指南中的各SQL语法。

参数说明

  • [ IF NOT EXISTS ]

    若在CREATE TABLE创建临时表时指定此选项,表示如果已经存在相同名称的表,不会抛出错误,而会发出通知,告知此表已存在。

  • table_name

    临时表名称,表名前的#代表其为临时表。

  • column_name

    字段名称。

  • data_type

    字段的数据类型。

  • column_constraint

    列约束的内容。

  • SELECT { * | cloumn_name [,…] }

    SELECT从源表中选取数据用于创建新表。

    SELECT *表示选取源表的所有字段,也可以指定若干个cloumn_name作为新表的字段。

  • new_table

    SELECT INTO语句中要创建的新表的名字。

  • old_table

    SELECT INTO语句中用于提供数据的源表名。

示例

示例1: 创建本地临时表。

1、在会话1中创建本地临时表并查看其数据。

create table #test_temp_table_1(
col1 int,
col2 char(10),
col3 varchar(10)
);
insert into #test_temp_table_1 values(1,'test','west');
insert into #test_temp_table_1 values(2,'test','public');
insert into #test_temp_table_1 values(3,'get','');
select * from #test_temp_table_1;   --查看临时表数据

返回结果如下:

 col1 |    col2    |  col3
------+------------+--------
    1 | test       | west
    2 | test       | public
    3 | get        |
(3 rows)

2、在会话2中查看会话1中创建的本地临时表。

select * from #test_temp_table_1;

无法查询到临时表,报错信息如下:

ERROR:  relation "#test_temp_table_1" does not exist on vastbase

示例2: 创建全局临时表。

1、在会话1中创建会话级别的全局临时表,查看临时表数据。

create table ##test_temp_table_3(
col1 int,
col2 char(10),
col3 varchar(10)
);
insert into ##test_temp_table_3 values(1,'test','west');
insert into ##test_temp_table_3 values(2,'test','public');
insert into ##test_temp_table_3 values(3,'get','');
select * from ##test_temp_table_3;   --查看临时表数据

返回结果如下:

 col1 |    col2    |  col3
------+------------+--------
    1 | test       | west
    2 | test       | public
    3 | get        |
(3 rows)

2、在会话2中查看全局临时表的数据。

select * from ##test_temp_table_3;

返回结果如下,全局临时表在其它会话中可见,但查不到数据:

 col1 | col2 | col3
------+------+------
(0 rows)

示例3: 指定全局临时表所在的schema。

1、查看当前所在的schema。

select current_schema;

返回结果如下:

 current_schema
----------------
 public
(1 row)

2、创建全局临时表##table_a

create table ##table_a(id int,name text);
insert into ##table_a values(1,'jack');

3、查看全局临时表所在的schema。

select schemaname from pg_tables where tablename='##table_a';

返回结果如下,全局临时表被创建在了当前schema中:

 schemaname
------------
 public
(1 row)

4、创建新的模式newschema,并切换到该模式下。

create schema newschema;
set current_schema to newschema;

5、切换完成后,查看当前schema。

select current_schema;

返回结果如下,当前在newschema下:

 current_schema
----------------
 newschema
(1 row)

6、创建全局临时表##table_b

create table ##table_b(id int,name text);
insert into ##table_b values(1,'jack');

7、查看全局临时表所在的schema。

select schemaname from pg_tables where tablename='##table_b';

返回结果如下,全局临时表被创建在了newschema中:

 schemaname
------------
 newschema
(1 row)

示例4: SELECT INTO创建临时表。

1、创建本地临时表并插入数据。

create table #test_temp_table_1(
col1 int,col2 int,col3 text,col4 varchar);
insert into #test_temp_table_1 values(1,2019,'ceshi',8);
insert into #test_temp_table_1 values(2,2023,'ceshi_',9);

2、查看本地临时表数据。

select * from #test_temp_table_1;

返回结果如下:

 col1 | col2 |  col3  | col4
------+------+--------+------
    1 | 2019 | ceshi  | 8
    2 | 2023 | ceshi_ | 9
(2 rows)

3、执行select into语句,从本地临时表中选取字段用于创建一个新的全局临时表。

select col1,col4 into ##test_temp_table_2 from #test_temp_table_1;

4、查看新全局临时表的结构。

\d+ ##test_temp_table_2;

返回结果如下:

                Table "newschema.##test_temp_table_2"
 Column |  Type   | Modifiers | Storage  | Stats target | Description
--------+---------+-----------+----------+--------------+-------------
 col1   | integer |           | plain    |              |
 col4   | varchar |           | extended |              |
Has OIDs: no
Options: orientation=row, compression=no, fillfactor=80, on_commit_delete_rows=false

5、查看新表的数据。

select * from ##test_temp_table_2;

返回结果如下:

 col1 | col4
------+------
    1 | 8
    2 | 9
(2 rows)