我有一个名为tester的表,我需要用一个临时表覆盖它以进行一些测试。到目前为止,我已经使用:
CREATE TEMPORARY TABLE tester AS
SELECT * FROM tester WHERE name='bananas';
这个临时表将在会话结束时消失,这对我来说很好,但是它是负责连接的外部应用程序,它倾向于缓存连接以供重用(因此不能保证临时表有被丢弃)。这意味着如果我再次尝试执行上述查询,它可能会失败,因为临时表仍然存在。
显式删除临时表并不是一个真正的选择。我宁愿忍受失败的查询,也不愿冒险错误地删除底层的“真实”表。
我想做的只是在临时表不存在的情况下创建它。我确实发现人们建议在检查表是否存在时应该使用这个查询:
SELECT * FROM pg_catalog.pg_class WHERE relkind = 'r' AND relname = 'tester';
result when temporary table exists:
relname | relnamespace | reltype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | reltoastrelid | reltoastidxid | relhasindex | relisshared | relkind | relnatts | relchecks | reltriggers | relukeys | relfkeys | relrefs | relhasoids | relhaspkey | relhasrules | relhassubclass | relfrozenxid | relacl | reloptions
---------+--------------+---------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+---------+----------+-----------+-------------+----------+----------+---------+------------+------------+-------------+----------------+--------------+--------+------------
tester | 2200 | 1533065 | 1531747 | 0 | 1533063 | 0 | 0 | 0 | 1533067 | 0 | t | f | r | 3 | 0 | 0 | 0 | 0 | 0 | f | t | f | f | 17654031 | |
tester | 1533088 | 1533065 | 1531747 | 0 | 1533160 | 0 | 0 | 0 | 1533163 | 0 | f | f | r | 3 | 0 | 0 | 0 | 0 | 0 | f | f | f | f | 17654066 | |
如您所见,有两条记录。一个用于原始表,一个用于临时表。第二条记录是临时表——我知道这一点是因为它在不同会话中工作时会消失——但除了缺少索引或主键之外,这是我可以将其识别为临时表的唯一方法。这只是一个测试表——我正在使用的一些真实表可能缺少索引和/或主键。
问题(tl;dr 版):如果已经存在同名的“真实”表,我如何测试临时表是否存在?(或者至少确定一个表是临时的?)
免责声明:我添加了 Java 标记,因为这是我用来执行查询的(SQL 只是应用程序的一小部分)。尽管 Java 与该问题没有直接关系,但我需要的不是可以从 Java 上下文中使用的答案。