GBase 8a支持创建Temporary表,允许不同的session使用相同的临时表名字而不会冲突。这些表在session关闭时会自动销毁。但如果使用了连接池,还是会有冲突,所以还是建议用户自行销毁临时表。或者在使用前删除可能存在的临时表。
目录导航
临时表语法
create temporary table TABLE_NAME 表定义
create temporary table TABLE_NAME like 另一个表
create temporary table TABLE_NAME as select 。。。
其中TABLE_NAME是临时表名字。
注意,请一定避免和物理表重合,否则虽然看上去名字相同,但临时表的优先级比物理表高,会导致不可预期的结果。
样例
临时表是可以正常加载的。
创建普通临时表
gbase> create temporary table tmp_v1 (id int, name varchar(100));
Query OK, 0 rows affected (Elapsed: 00:00:00.26)
gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.201/home/gbase/t1.txt' into table tmp_v1;
Query OK, 0 rows affected (Elapsed: 00:00:13.49)
Task 5111818 finished, Loaded 1000001 records, Skipped 0 records
gbase> show create table tmp_v1;
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tmp_v1 | CREATE TEMPORARY TABLE "tmp_v1" (
"id" int(11) DEFAULT NULL,
"name" varchar(100) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)
使用like创建temporary临时表
gbase> create temporary table tmp_zxq1 like tt;
Query OK, 0 rows affected (Elapsed: 00:00:00.33)
使用create as 创建结果集的temporary表
gbase> create temporary table tmp_zxq2 as select * from t1 limit 10;
Query OK, 10 rows affected (Elapsed: 00:00:00.40)
创建引起混淆的和物理表相同名字的temporary临时表
原始表t1有10001行,创建的t1临时表只有10行。后面t1到底是哪个? 临时表优先,会引起结果集不符合预期。
gbase> create temporary table t1 as select * from t1 limit 10;
Query OK, 10 rows affected (Elapsed: 00:00:00.40)
gbase> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TEMPORARY TABLE "t1" (
"id" int(11) DEFAULT NULL,
"name" varchar(100) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 10 |
+----------+
1 row in set (Elapsed: 00:00:00.01)
数据库内部实现
数据库是在gclusterdb库下面创建如下命名的表,来实现temporary的临时表的,通过nodeid和sessionid 已经创建临时表的递增顺序,避免了临时表的重复现象。
- gcs是临时表
- 3372351498 是调度节点的nodeid
- 24 是连接的session id
- 0,1,2,3,4,5 是创建的第几个。
gbase> show tables like 'gcs%';
+-----------------------------+
| Tables_in_gclusterdb (gcs%) |
+-----------------------------+
| gcs_3372351498_24_0 |
| gcs_3372351498_24_1 |
| gcs_3372351498_24_3 |
| gcs_3372351498_24_4 |
| gcs_3372351498_24_5 |
+-----------------------------+
5 rows in set (Elapsed: 00:00:00.00)