SQL

在PostgreSQL中删除表而不删除相关序列

发布于 2021-04-20 23:17:56

我有一张桌子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不再对序列具有任何可见的依赖关系,但是它仍然尝试将序列与表一起删除(显然不会,因为新表依赖该表)。

因此,问题分为两部分:

  1. 为什么序列仍然与旧表链接?
  2. 有没有办法解决这个问题,而不必使新表依赖于新的或不同的序列(如果有帮助的话)?

(在PostgreSQL 8.4上)

关注者
0
被浏览
109
1 个回答
  • 面试哥
    面试哥 2021-04-20
    为面试而生,有面试问题,就找面试哥。

    试试这个:

    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)
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看