现实的开发过程中使用 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 " 信息,但不会中断执行流程。这种行为使得编写脚本时更加容易,不需要在删除表之前检查表是否存在。