18

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

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

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

   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变为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

因此foo_old不再对序列有任何可见的依赖关系,但它仍然尝试将序列与表一起删除(显然不会,因为新表依赖于它)。

所以问题分为两部分:

  1. 为什么序列仍然与旧表链接?
  2. 有什么办法不涉及使新表依赖于新的或不同的序列(如果这甚至有帮助)?

(在 PostgreSQL 8.4 上)

4

1 回答 1

32

试试这个:

ALTER SEQUENCE foo_id_seq 由 NONE 拥有

那么你应该能够放下桌子。

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

选择 s.relname 作为 sequence_name,  
       n.nspname 作为 sequence_schema,  
       t.relname 作为related_table,
       a.attname 作为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.rel命名空间
    AND d.objid = s.oid
    AND d.refobjid = t.oid
    AND (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)
于 2010-12-01T20:56:23.147 回答