临时表是一种特殊的数据表,用于在短期内本地存储和处理数据。与常规表不同,临时表的数据仅限于当前会话(连接),而不会影响其他会话。以下是对临时表的介绍及其类型:


临时表的特点:

  1. 会话隔离: 每个会话都有临时表的独立实例,不与其他会话共享数据。会话只能访问自己插入的数据,即使表名相同。
  2. 自动清理: 会话结束后,临时表中的数据会自动清除,无需显式执行 DELETEDROP TABLE
  3. 轻量级: 相比常规表,临时表可能节省日志和锁的开销,适用于临时数据的存储和处理。

临时表的类型:

  1. 全局临时表(Global Temporary Table, GTT)
  2. 本地临时表(Local Temporary Table, LTT)
  3. 声明的本地临时表(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/GLOBALON COMMIT,数据在会话结束时清除。

Oracle:

  • 仅支持 全局临时表(GTT)
  • 不支持 LTT 和 DLTT。

示例总结:

临时表为短期数据处理提供了高效的解决方案。根据需求选择合适的临时表类型,可以提升数据操作的灵活性和性能。

Last modified: Tuesday, 28 January 2025, 2:01 PM