2016-10-24 48 views
2

我有一个视图取决于一个表:create view hello_v as select * from hello; 要从视图名称检索引用的表名,我认为pg_class和pg_depend表可能会有用。 截断表格导致pg_depend中没有条目。pg_catalog.pg_class.relfilenode截断后

如何返回等于pg_catalog.relfilenode的pg_depend.refobjid?

我可以重现我的观点:

select version(); 

create table hello(name text); 
create view hello_v as select * from hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname in ('hello', 'hello_v') group by relname, relfilenode order by c.relname; 

relname | relfilenode 
---------+------------- 
hello |  305818 
hello_v |  305824 

truncate hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname in ('hello', 'hello_v') group by relname, relfilenode order by c.relname; 

relname | relfilenode 
---------+------------- 
hello_v |  305824 

-- I hope to exist a record where relname = hello and relfilenode = xxx 

或者干脆:

create table hello(name text); 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname = 'hello' group by relname, relfilenode order by c.relname; 

truncate hello; 

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.relfilenode 
    where c.relname = 'hello' group by relname, relfilenode order by c.relname; 

感谢。

回答

0

您的连接条件有误。你想加入c.oid,而不是relfilenode。

这正确地显示你的表:

select c.relname, c.relfilenode from pg_catalog.pg_class c inner join pg_catalog.pg_depend d on d.refobjid = c.oid 
where c.relname = 'hello' group by relname, relfilenode order by c.relname;