【发布时间】:2010-12-01 20:38:58
【问题描述】:
我有一张桌子,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 变成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 上)
【问题讨论】:
标签: sql postgresql sequence sequences