临时表
功能描述
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)
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)