Postgresql 确定哪些对象依赖于序列?
我正试图Postgresql 确定哪些对象依赖于序列?,postgresql,Postgresql,我正试图删除表中不应存在的序列。很明显,如果使用了CASCADE选项,依赖于该序列的对象将被删除。您如何确定这些可能是什么对象(如果存在) 具体地说,在生产数据库中运行此操作之前,我需要验证不会删除任何关键内容 我可以确定是否使用了序列: dev=> SELECT sequence_name, last_value FROM mytable_columnname_seq; sequence_name | last_value ---------------------
删除表中不应存在的序列。很明显,如果使用了CASCADE
选项,依赖于该序列的对象将被删除。您如何确定这些可能是什么对象(如果存在)
具体地说,在生产数据库中运行此操作之前,我需要验证不会删除任何关键内容
我可以确定是否使用了序列:
dev=> SELECT sequence_name, last_value FROM mytable_columnname_seq;
sequence_name | last_value
-----------------------+------------
mytable_columnname_seq | 2
(1 row)
在上面我们看到,last_值
是2
,这意味着它已被使用。但这并不能说明是什么
决心(多亏了一匹没有名字和窑的马;我不能接受这两个答案,这很遗憾):
“dependent”对象是表中为序列指定的列的默认值。如果删除列的默认值是安全的,那么删除序列也是同样安全的:不会删除任何行或表,它们的值将保持不变。这对我很有用:
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'
这对我很有用:
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'
如果序列是一列,如本例所示:
create table example_table (id serial);
您可以使用从序列名确定表名:
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)
如果序列是一列,如本例所示:
create table example_table (id serial);
您可以使用从序列名确定表名:
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)
这是否意味着只有该表是“依赖对象”?如果是,如果使用了CASCADE
,该表将被删除?听起来不太对?该表不会被删除。如果表(或列)被删除,则序列将被删除。这是否意味着只有该表是“依赖对象”?如果是,如果使用了CASCADE
,该表将被删除?听起来不太对?该表不会被删除。如果表(或列)被删除,则序列将被删除。其结果将是表\u名称
:这是否意味着级联
将删除该表?(PostGres文档很清楚在这种情况下它认为“对象”是什么。)@NathanielFord:no.cascade
不删除表,只删除列与序列的关联。因此,“串行”列将成为“普通”整数列,而没有默认值。那么,为什么要提供RESTRICT
选项呢?我肯定缺少一些基本的理解。也许你不想删除该列的默认值?有关删除的结果,请参见此处。。级联
:如果删除一个序列,则相应列的所有值保持不变,只有默认
约束被删除。其结果将是一个表名
:这是否意味着级联
将删除该表?(PostGres文档很清楚在这种情况下它认为“对象”是什么。)@NathanielFord:no.cascade
不删除表,只删除列与序列的关联。因此,“串行”列将成为“普通”整数列,而没有默认值。那么,为什么要提供RESTRICT
选项呢?我肯定缺少一些基本的理解。也许你不想删除该列的默认值?有关删除的结果,请参见此处。。级联
:如果删除一个序列,则相应列的所有值保持不变,仅删除默认
约束。