Kid*_*mpo 4 java sql postgresql
我有一个名为tester的表,我需要在该表上覆盖一个临时表才能进行一些测试。到目前为止,我已经使用以下方法进行了管理:
CREATE TEMPORARY TABLE tester AS
SELECT * FROM tester WHERE name='bananas';
Run Code Online (Sandbox Code Playgroud)
这个临时表将在会话结束时消失,这对我来说很好,但是由外部应用程序负责连接,并且它倾向于缓存连接以供重用(因此无法保证临时表具有已删除)。这意味着,如果我再次尝试执行上述查询,则可能会失败,因为临时表仍然存在。
显式删除临时表并不是真正的选择。我宁愿接受失败的查询,也不要冒险误删除底层的“真实”表。
我会做的是只创建临时表,如果它不存在。我确实找到了这个查询,人们在检查表是否存在时应该使用该查询:
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 | |
Run Code Online (Sandbox Code Playgroud)
如您所见,有两条记录。一个用于原始表,另一个用于临时表。第二条记录是临时表-我知道这是因为它在不同的会话中工作时会消失-但除了缺少索引或主键之外,这是我可以识别为临时表的唯一方法。这只是一个测试表-我正在使用的某些实际表可能缺少索引和/或主键。
问题(tl; dr版):如果已经存在同名的“真实”表,如何测试临时表是否存在?(或至少确定表是临时的?)
免责声明:我添加了Java标记,因为这是我用来执行查询的内容(SQL只是应用程序的一小部分)。即使Java与该问题没有直接关系,但我仍然需要可以在Java上下文中使用的答案。
用户定义函数,用于检查临时表是否存在。
CREATE or REPLACE FUNCTION public.iftableexists( varchar)
RETURNS pg_catalog.bool AS
$BODY$
DECLARE
BEGIN
/* check the table exist in database and is visible*/
perform n.nspname ,c.relname
FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid
= c.relnamespace
where n.nspname like 'pg_temp_%' AND pg_catalog.pg_table_is_visible(c.oid)
AND Upper(relname) = Upper($1);
IF FOUND THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
Run Code Online (Sandbox Code Playgroud)
小智 5
我想要做的只是创建临时表,如果它不存在。
CREATE TEMPORARY TABLE IF NOT EXISTS tester AS
SELECT * FROM tester WHERE name='bananas';
Run Code Online (Sandbox Code Playgroud)
like
我不明白为什么当有一列包含我们需要的信息时您想要“模糊搜索” 。也许存在一些我不知道的向后兼容性问题。
这是与上面相同的代码,但使用table_type = 'LOCAL TEMPORARY
而不是like 'pg_temp_%'
SELECT EXISTS (
SELECT 1
FROM information_schema.tables
WHERE table_type = 'LOCAL TEMPORARY'
AND table_name = 'table_name'
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6889 次 |
最近记录: |