Oracle和PG数据库临时表的差异,PG数据库如何删除临时表

现实的开发过程中使用 PG 数据库删除临时表发现如下报错,提示表 xxx 不存在:
在这里插入图片描述
问题原因: 调用删除语句,但是临时表不存在了。
解决方案: PG下用下面的方式来删除临时表或不进行删除(会话级临时表会自动删除,下面有详细解释)。

DROP TABLE IF EXISTS temp_table_name CASCADE;

代码解决示例:
在这里插入图片描述

Oracle 中的临时表

1. 全局临时表

- 在 Oracle 中,临时表分为全局临时表和本地临时表。
- 全局临时表是对所有用户可见的,数据在会话之间共享,但是会话结束后表中数据会被清除。
- 创建全局临时表时,使用 CREATE GLOBAL TEMPORARY TABLE 语句,并在表定义中指定 ON COMMIT PRESERVE ROWS ,以确保数据在事务提交之前不被清除。注: 如果把 PRESERVE 改成 DELETE 创建的全局临时表会在事务结束后被删除,也称为事物级全局临时表,我们一般使用的就是后者事物级全局临时表。

2. 本地临时表

- 本地临时表是对当前用户可见的,只能在创建该表的会话中使用,其他会话无法访问。
- 本地临时表的数据在会话结束后自动清除,不需要显式清除操作。

3. 表的生命周期

- 在 Oracle 中,全局临时表的生命周期是在会话结束时或者事务结束时,数据会被自动清除。
- 本地临时表的生命周期则是在会话结束时,数据会被自动清除。

4. 语法

- 创建全局临时表: CREATE GLOBAL TEMPORARY TABLE table_name (...) ON COMMIT PRESERVE ROWS;
- 创建本地临时表: CREATE [LOCAL] TEMPORARY TABLE table_name (...) ON COMMIT PRESERVE ROWS;

PostgreSQL 中的临时表

1. 会话临时表

- 在 PostgreSQL 中,临时表是会话级别的,即只对创建它的会话可见。
- 当会话结束时,临时表及其数据会被自动清除。

2. 表的生命周期

- 临时表的生命周期与会话的生命周期相同,当会话结束时,临时表会被自动删除。

3. 语法

- 创建临时表: CREATE TEMPORARY TABLE table_name (...)

4. 支持性

- PostgreSQL 中的临时表更符合 SQL 标准,不同于 Oracle 中的全局临时表和本地临时表的区别, PostgreSQL 中只有一种类型的临时表。

主要区别总结

  • 范围: Oracle 支持全局临时表和本地临时表,而 PostgreSQL 只支持会话临时表。
  • 语法: Oracle 需要在创建临时表时明确指定表的范围(全局或本地),而 PostgreSQL 的语法更简单,只需使用 CREATE TEMPORARY TABLE
  • 清除时机: Oracle 的全局临时表需要手动清除数据,而其他类型的临时表在会话结束时会自动清除; PostgreSQL 中的临时表在会话结束时会自动清除。

拓展1:PG 模拟全局临时表

PostgreSQL 中,你可以通过使用模式( Schema )和特定的权限控制,模拟出一种类似于全局临时表的行为。具体来说,你可以创建一个专门的模式用于存放临时表,然后对其他用户隐藏这个模式,以达到全局临时表的效果。

下面是一个简单的示例,演示了如何在 PostgreSQL 中创建类似全局临时表的行为:
① 创建一个专门的模式用于存放临时表

CREATE SCHEMA global_temp_tables;

② 创建一个临时表,并将其放置在 global_temp_tables 模式下

CREATE TABLE global_temp_tables.temp_table (
    id SERIAL PRIMARY KEY,
    name TEXT
);

③ 对其他用户隐藏 global_temp_tables 模式

REVOKE ALL ON SCHEMA global_temp_tables FROM PUBLIC;

通过以上步骤,其他用户将无法访问或修改 global_temp_tables 模式中的临时表。这样,你就可以在 PostgreSQL 中模拟出一种类似于全局临时表的行为。

需要注意的是,这种方法并不是严格意义上的全局临时表,因为临时表的生命周期仍然受到会话的影响,而不是全局的。然而,通过模式的隔离和权限控制,你可以实现一种在多个会话之间共享临时表的行为。

拓展2:oracle 删除不存在的临时表

Oracle 中,如果尝试删除一个不存在的临时表,不会导致错误。相反, DROP TABLE 语句会静默地返回并继续执行后续的 SQL 语句。这意味着即使尝试删除一个不存在的临时表,也不会产生任何异常或错误消息。 Oracle 中的 DROP TABLE 语句的行为是,如果表不存在,则返回一个 " Table or view does not exist " 信息,但不会中断执行流程。这种行为使得编写脚本时更加容易,不需要在删除表之前检查表是否存在。

相关推荐

  1. 查询pg 数据库行数, 大小

    2024-04-13 09:10:02       18 阅读
  2. oracle 临时

    2024-04-13 09:10:02       9 阅读
  3. 22.Oracle临时空间

    2024-04-13 09:10:02       42 阅读
  4. MySQL内存临时区别

    2024-04-13 09:10:02       17 阅读
  5. 创建临时(DM8达梦数据库)

    2024-04-13 09:10:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 09:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 09:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 09:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 09:10:02       18 阅读

热门阅读

  1. 3d max快捷键命令大全

    2024-04-13 09:10:02       23 阅读
  2. 用自动LOD简化3D网格【Babylon.js】

    2024-04-13 09:10:02       20 阅读
  3. Python如何使用不同的库来导出PDF和XLSX

    2024-04-13 09:10:02       16 阅读
  4. C语言--第二章之位运算符

    2024-04-13 09:10:02       15 阅读
  5. 熟练使用Nacos、GateWay、OpenFeign、Sentinel常用组件

    2024-04-13 09:10:02       15 阅读
  6. 微服务下使用sentinel进行服务熔断

    2024-04-13 09:10:02       18 阅读
  7. C++题目讲解目录

    2024-04-13 09:10:02       17 阅读
  8. QThread线程退出

    2024-04-13 09:10:02       21 阅读
  9. 图像处理-采样方法概述

    2024-04-13 09:10:02       16 阅读
  10. C++猫和老鼠有多重(友元函数初步)

    2024-04-13 09:10:02       14 阅读
  11. 亚信安慧AntDB:实时数据洞察的利器

    2024-04-13 09:10:02       36 阅读
  12. 高级IO——非阻塞IO和select

    2024-04-13 09:10:02       16 阅读
  13. 设计模式|建造者模式(Builder Pattern)

    2024-04-13 09:10:02       15 阅读