删除PostgreSQL中的表而不删除关联的序列

时间:2010-12-01 20:38:59

标签: sql postgresql sequence sequences

我有一张桌子foo。为了快速升级/部署我的网站,我创建了一个新表tmp_foo,以包含一些新数据:

create table tmp_foo (like foo including constraints including defaults including indexes);

现在每个表都有一个PK id列,如下所示:

   Column    |         Type          |                                Modifiers                                 
-------------+-----------------------+--------------------------------------------------------------------------
 id          | integer               | not null default nextval('foo_id_seq'::regclass)

重要的是,两个表都依赖于完全相同的序列foo_id_seq。没有tmp_foo_id_seq。这对我来说似乎没问题。

在此之后,我使用新数据加载tmp_foo并重命名表格,以便tmp_foo接管真实foo,原始foo成为{{1} }}。现在我尝试删除foo_old

foo_old

足够公平,db=> drop table foo_old ; ERROR: cannot drop table foo_old because other objects depend on it DETAIL: default for table foo_old column id depends on sequence foo_id_seq 列默认值仍然取决于序列。

id

这是踢球者。

db=> alter table foo_old alter column id drop default;

所以db=> drop table foo_old ; ERROR: cannot drop table foo_old because other objects depend on it DETAIL: default for table foo column id depends on sequence foo_id_seq 不再对序列有任何明显的依赖关系,但它仍然试图将序列与表一起删除(显然不会因为新表依赖于它)。

所以问题是两部分:

  1. 为什么序列仍然链接 用旧桌子?
  2. 有没有 绕过这个不涉及的方式 使新表依赖于 新的或不同的序列(如果那样 甚至可以帮忙吗?
  3. (在PostgreSQL 8.4上)

1 个答案:

答案 0 :(得分:26)

试试这个:

ALTER SEQUENCE foo_id_seq OWNED BY NONE

那么你应该可以放弃这张桌子。

要检索序列的“所有者”,请使用以下查询

SELECT s.relname as sequence_name,  
       n.nspname as sequence_schema,  
       t.relname as related_table, 
       a.attname as related_column 
  FROM pg_class s, pg_depend d, pg_class t, pg_attribute a, pg_namespace n 
  WHERE s.relkind     = 'S' 
    AND n.oid         = s.relnamespace 
    AND d.objid       = s.oid 
    AND d.refobjid    = t.oid 
    AND (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)