【问题标题】:Deleting a table in PostgreSQL without deleting an associated sequence删除 PostgreSQL 中的表而不删除关联的序列
【发布时间】: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 不再对序列有任何可见的依赖关系,但它仍然尝试将序列与表一起删除(显然不会,因为新表依赖于它)。

所以问题分为两部分:

  1. 为什么序列仍然链接 与旧表?
  2. 有没有 解决这个问题的方法不涉及 使新表依赖于 新的或不同的序列(如果 甚至会有所帮助)?

(在 PostgreSQL 8.4 上)

【问题讨论】:

    标签: sql postgresql sequence sequences


    【解决方案1】:

    试试这个:

    ALTER SEQUENCE foo_id_seq 由 NONE 拥有

    那么你应该可以删除表了。

    要检索序列的“所有者”,请使用以下查询

    选择 s.relname 作为 sequence_name, n.nspname 作为 sequence_schema, t.relname 作为related_table, a.attname 作为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.rel命名空间 AND d.objid = s.oid AND d.refobjid = t.oid AND (d.refobjid, d.refobjsubid) = (a.attrelid, a.attnum)

    【讨论】:

    • 啊哈。那行得通。 (实际上,由于我很偏执,所以我将新表设为所有者,而不是没有。)你碰巧知道如何检查序列的所有者吗? \d 不显示,select * from foo_id_seq 也不显示。
    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 2010-09-07
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多