我有一个名为foo
的表。为了快速升级/部署我的网站,我创建了一个新表tmp_foo
来包含一些新数据,方法如下:
create table tmp_foo (like foo including constraints including defaults including indexes);
现在每个表都有一个主键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 上)
\d
不显示它,select * from foo_id_seq
也不显示。 - Alison R.