我有一张桌子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
不再对序列有任何明显的依赖关系,但它仍然试图将序列与表一起删除(显然不会因为新表依赖于它)。
所以问题是两部分:
(在PostgreSQL 8.4上)
答案 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)