本文主要是介绍KingbaseES临时表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简介
临时表是在数据库中临时存储数据的一种特殊表格,通常为需要临时存储数据时提供一个临时性的存储空间,用于存储中间结果或者临时计算数据。
临时表在会话结束或不再需要时会自动销毁,不会永久保存数据,因此适合用于临时性需求,例如:复杂查询、数据处理或者临时存储过程中。
文章目录如下
1. 临时表的用法
1.1. 本地临时表
1.2. 全局临时表
2. 临时分区表的用法
2.1. 本地临时分区表
2.2. 全局临时分区表
1. 临时表的用法
1.1. 本地临时表
- 本地临时表就是简介中提到的,用于临时存储数据,会话结束后自动销毁,并且在会话1创建的临时表并不会作用到会话2。
创建本地临时表只需要在创建普通表的基础上增加特定的语法(TEMP)即可:
CREATE TEMP TABLE tmp_1(id int);
创建的临时表并不是保存在默认模式public中,而是在pg_temp_4。并且这种临时表只在当前会话有效,比如退出连接后临时表自动清理
临时表虽然会随着会话的退出而销毁,但在会话中是可以插入数据的:
1.2. 全局临时表
全局临时表不同于本地临时表,全局临时表的表定义是永久的,数据可以是临时或永久的。
--表永久,不保存数据
CREATE GLOBAL TEMP TABLE tmp_1(id int
);--表永久,保存数据
CREATE GLOBAL TEMP TABLE tmp_1(id int
) ON COMMIT PRESERVE ROWS;
这里给了2种创建临时表的方法,不论哪种表都是永久的
创建的全局临时表的模式会自动保存到public,因为它不是临时的。
分别来看一下这两种方式的形式:
【第1种方式】不保存数据
可以插入数据,但插入的数据不会保存。
【第2种方式】可以保存数据
这种方式的表定义和数据都是持久存储的,存储的方式与普通表就没有了区别,但是在应用层面上会多出各种限制,因此这种方式也只适用于一些特殊场景。
2. 临时分区表的用法
2.1. 本地临时分区表
临时表和临时分区表的用法和逻辑实际上都是一样的,比如创建一个本地的临时分区表
CREATE TEMP TABLE tmp_par1(id int
) PARTITION BY RANGE(id);
临时分区表的模式同样放在pg_temp_4中,表会随着连接的退出而销毁,会话2也无法访问会话1的临时表。当然,本地临时分区表也是可以插入数据的。
2.2. 全局临时分区表
全局临时分区表也和全局临时表一样,可以使表永久数据不存储、表永久数据存储,这里就不举例子了。需要注意的是,当创建了全局临时分区表时,我们向其插入数据时,单个连接最多只能访问32个全局临时表。举个例子:
创建一张可存储数据的全局临时分区表
CREATE GLOBAL TEMP TABLE tem_par1(id int
)
PARTITION BY RANGE(id)
ON COMMIT PRESERVE ROWS;
创建50个全局临时表子分区
\set SQLTERM /
DECLAREn int;name text;sql text;
BEGINFOR i IN 1..50 LOOPn := i + 1;name := 'tem_par1_p' || i;sql := 'CREATE GLOBAL TEMP TABLE ' || name || ' PARTITION OF tem_par1 FOR VALUES FROM (' || i || ') TO (' || n || ') ON COMMIT PRESERVE ROWS;';EXECUTE sql;END LOOP;
END;
/
- 注意:全局临时分区表的子分区也必须是全局临时表,子分区需要存储数据也必须加上 ON COMMIT PRESERVE ROWS
分区1存储整数1的数据,分区2存储整数2的数据,依此类推...
分区表创建完成后,在当前会话中一次性向33个分区插入数据
INSERT INTO tem_par1 VALUES (GENERATE_SERIES(1, 33));
截图可以看到,使用 GENERATE_SERIES 函数向全局临时分区表插入1~33的数据。由于1~33是分别存储在33个不同子分区中,也就代表同时访问了33个全局临时表,而Kingbase限制了单个连接允许访问全局临时表最多不超过32个,所以后面插入1~32是能够成功的。
这种限制目前没有参数可以修改,所以在插入数据时出现了该报错,则需要根据分区分段插入数据。
这篇关于KingbaseES临时表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!