在PostgreSQL中,如何查找哪个表使用特定的序列?

时间:2015-07-21 13:43:20

标签: postgresql

我有一个名为seque_post的序列。

我需要找出它正在使用的表格。 有没有办法编写一个会给出表名的查询?

我写了这个查询来查找序列:

select *
from pg_class
where relname like 'seque_post'

reltoastrelid根据manual提供了list?字段:

  

与此表关联的TOAST表的OID,如果没有,则为0。 TOAST表存储大型属性" out of line"在辅助表中。

但我不确定如何从这里继续......建议?

3 个答案:

答案 0 :(得分:6)

要查找表,序列是"相关的"你可以使用这样的东西:

select seq_ns.nspname as sequence_schema, 
       seq.relname as sequence_name,
       tab_ns.nspname as table_schema,
       tab.relname as related_table
from pg_class seq
  join pg_namespace seq_ns on seq.relnamespace = seq_ns.oid
  JOIN pg_depend d ON d.objid = seq.oid AND d.deptype = 'a' 
  JOIN pg_class tab ON d.objid = seq.oid AND d.refobjid = tab.oid
  JOIN pg_namespace tab_ns on tab.relnamespace = tab_ns.oid
where seq.relkind = 'S' 
  and seq.relname = 'seque_post'
  and seq_ns.nspname = 'public';

只是为了完成图片:

反过来(查找列的序列)更容易,因为Postgres有一个函数来查找列的序列:

select pg_get_serial_sequence('public.some_table', 'some_column');

答案 1 :(得分:1)

这里的关键目录是相当多才多艺的pg_depend,它基本上可以连接任何类型的任何两个项目。

::regclass强制转换是转换为oid和来自select D.refobjid::regclass, -- the target table name D.* -- see docs for meaning of other columns from pg_depend as D where -- source is a relation (in this case, a sequence) D.classid = 'pg_catalog.pg_class'::regclass -- target is also a relation (in this case, a table) and D.refclassid = 'pg_catalog.pg_class'::regclass -- source is the sequence you're looking for, fully qualified name and D.objid = 'public.seque_post'::regclass 的魔术技巧,它允许您查找类似的内容,没有连接(但可能有歧义):

{{1}}

答案 2 :(得分:1)

尝试使用pg_depend而不是pg_class:

SELECT d.refobjid::regclass, a.attname
FROM   pg_depend d
JOIN   pg_attribute a ON a.attrelid = d.refobjid AND a.attnum = d.refobjsubid
WHERE  d.objid = 'public."seque_post"'::regclass;

如果将连接添加到pg_attribute,那么您甚至可以使用使用该序列的列名。 :: regclass强制转换可用于将对象标识符神奇地转换为关系名称。

希望有所帮助。