我有一张桌子,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不再对序列有任何可见的依赖关系,但它仍然尝试将序列与表一起删除(显然不会,因为新表依赖于它)。
所以问题分为两部分:
- 为什么序列仍然与旧表链接?
- 有什么办法不涉及使新表依赖于新的或不同的序列(如果这甚至有帮助)?
(在 PostgreSQL 8.4 上)