gpt4 book ai didi

sql - 在不删除关联序列的情况下删除 PostgreSQL 中的表

转载 作者:行者123 更新时间:2023-11-29 11:13:36 25 4
gpt4 key购买 nike

我有一张 table ,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. 为什么序列仍然链接用旧 table ?
  2. 有没有解决这个问题的方法不涉及使新表依赖于新的或不同的顺序(如果甚至会有帮助)?

(在 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)

关于sql - 在不删除关联序列的情况下删除 PostgreSQL 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com