Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 确定哪些对象依赖于序列?_Postgresql - Fatal编程技术网

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
选项呢?我肯定缺少一些基本的理解。也许你不想删除该列的默认值?有关
删除的结果,请参见此处。。级联
:如果删除一个序列,则相应列的所有值保持不变,仅删除
默认
约束。