在PostgreSQL中删除表而不删除相关序列
我有一张桌子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上)
-
试试这个:
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)
-
从列表中删除 None 值而不删除 0 值
2022-05-26 关注 0 浏览11 1答案
-
从列表中删除无值而不删除0值
2021-01-29 关注 0 浏览83 1答案
-
从 SVN 存储库中删除文件而不删除本地副本
2022-07-28 关注 0 浏览16 1答案
-
不可以在不删除表的情况下,删除表中所有的行。
2022-05-11 关注 0 浏览15 1答案
-
如何在JavaScript中仅删除父元素而不删除其子元素?
2021-02-02 关注 0 浏览86 1答案
-
在Swift中拆分字符串而不删除定界符
2021-01-31 关注 0 浏览137 1答案
-
如何使用通配符在PostgreSQL中删除多个表
2021-05-10 关注 0 浏览58 1答案
-
从索引/类型中删除所有文档而不删除类型
2022-07-28 关注 0 浏览15 1答案
-
如何从集合中检索元素而不删除它?
2022-03-22 关注 0 浏览37 1答案
-
写入文件而不删除旧数据
2021-01-30 关注 0 浏览74 1答案