结构化查询语言(Structured Query Language)
Completion requirements
临时表是一种特殊的数据表,用于在短期内本地存储和处理数据。与常规表不同,临时表的数据仅限于当前会话(连接),而不会影响其他会话。以下是对临时表的介绍及其类型:
临时表的特点:
- 会话隔离: 每个会话都有临时表的独立实例,不与其他会话共享数据。会话只能访问自己插入的数据,即使表名相同。
- 自动清理: 会话结束后,临时表中的数据会自动清除,无需显式执行
DELETE
或DROP TABLE
。 - 轻量级: 相比常规表,临时表可能节省日志和锁的开销,适用于临时数据的存储和处理。
临时表的类型:
- 全局临时表(Global Temporary Table, GTT)
- 本地临时表(Local Temporary Table, LTT)
- 声明的本地临时表(Declared Local Temporary Table, DLTT)
定义语法:
CREATE GLOBAL TEMPORARY TABLE <表名> (...) [ON COMMIT {PRESERVE | DELETE} ROWS];
CREATE LOCAL TEMPORARY TABLE <表名> (...) [ON COMMIT {PRESERVE | DELETE} ROWS];
DECLARE LOCAL TEMPORARY TABLE <表名> (...) [ON COMMIT {PRESERVE | DELETE} ROWS];
ON COMMIT DELETE ROWS
:每次执行COMMIT
后,表中的数据自动清除。ON COMMIT PRESERVE ROWS
:表中的数据在COMMIT
后保留,直到会话结束。
类型详解:
1. 全局临时表(GTT)
- 定义的持久性: 表定义在数据库中永久存在,所有会话都可以使用,但每个会话有独立的数据实例。
- 使用场景: 适合存储会话的中间结果或记录特定活动的日志。
- 示例:
CREATE GLOBAL TEMPORARY TABLE temp1 ( ts TIMESTAMP, action CHAR(100), state CHAR(50) ) ON COMMIT PRESERVE ROWS; -- 插入数据 INSERT INTO temp1 VALUES (CURRENT_TIMESTAMP, 'Request sent', 'OK'); SELECT COUNT(*) FROM temp1 WHERE state = 'OK'; -- 查询数据 COMMIT;
2. 本地临时表(LTT)
- 定义的生命周期: 表定义仅在当前会话中存在,断开连接后表定义消失。
- 多会话隔离: 各会话可以使用相同的表名,而不相互影响。
- 使用场景: 适合每个会话需要独立的临时存储。
- 示例:
CREATE LOCAL TEMPORARY TABLE temp2 ( ts TIMESTAMP, action CHAR(100), state CHAR(50) ) ON COMMIT PRESERVE ROWS; -- 插入数据并查询 INSERT INTO temp2 VALUES (CURRENT_TIMESTAMP, 'Processing', 'Pending'); SELECT * FROM temp2;
3. 声明的本地临时表(DLTT)
- 模块范围: 表定义仅在当前模块内有效,不存储在数据库的信息架构中。
- 使用场景: 适合模块内部临时处理数据。
- 示例:
DECLARE LOCAL TEMPORARY TABLE temp3 ( ts TIMESTAMP, action CHAR(100), state CHAR(50) ) ON COMMIT PRESERVE ROWS; -- 在同一模块中插入和使用数据 INSERT INTO temp3 VALUES (CURRENT_TIMESTAMP, 'Init task', 'OK');
实现提示:
MySQL:
- 仅支持 本地临时表(LTT)。
- 省略
LOCAL/GLOBAL
和ON COMMIT
,数据在会话结束时清除。
Oracle:
- 仅支持 全局临时表(GTT)。
- 不支持 LTT 和 DLTT。
示例总结:
临时表为短期数据处理提供了高效的解决方案。根据需求选择合适的临时表类型,可以提升数据操作的灵活性和性能。
Last modified: Tuesday, 28 January 2025, 2:01 PM