确定哪些对象依赖于序列?

时间:2015-12-16 21:26:23

标签: postgresql

我尝试DROP SEQUENCE我的表中不应该存在的序列CASCADEThe documentation很明显,如果使用dev=> SELECT sequence_name, last_value FROM mytable_columnname_seq; sequence_name | last_value -----------------------+------------ mytable_columnname_seq | 2 (1 row) 选项,将删除依赖于该序列的对象。你如何确定那些对象(如果存在)?

具体来说,在生产数据库中运行之前,我需要验证是否会删除任何关键字。

我可以确定是否使用了序列:

last_value

在上面我们看到2V,这意味着它已被使用。但它并没有通过 来表示。

决议(感谢a_horse_with_no_name和kiln;我无法接受这两个答案,这是一种耻辱):

依赖' object是表的序列所分配列的默认值。如果可以安全地删除列的默认值,则删除序列同样安全:不会删除任何行或表,并且它们的值将保持不变。

2 个答案:

答案 0 :(得分:2)

这对我有用:

select n.nspname as table_schema, cl.relname as table_name
from pg_class s
  join pg_depend d on d.objid=s.oid and d.classid='pg_class'::regclass and d.refclassid='pg_class'::regclass
  join pg_class cl on cl.oid = d.refobjid 
  join pg_namespace n on n.oid = cl.relnamespace
  join pg_attribute a on a.attrelid = cl.oid and a.attnum=d.refobjsubid
where s.relkind='S' 
  and d.deptype='a'  
  and n.nspname = 'schema of the sequence' 
  and s.relname = 'sequence name'

答案 1 :(得分:1)

如果一个序列是owned by一列,就像这样:

create table example_table (id serial);

您可以使用pg_depend从序列名称确定表名:

select refobjid::regclass as table_name
from pg_depend
where objid = 'example_table_id_seq'::regclass
and deptype = 'a';

  table_name   
---------------
 example_table
(1 row)