PostgreSQL删除表

3
我有两个表(tbl和tbl_new),它们都使用相同的序列(tbl_id_seq)。我想删除其中一个表。在tbl上,我已经移除了修饰符“not null default nextval('tbl_id_seq'::regclass)”,但是该修饰符仍然存在于tbl_new上。我遇到了以下错误:
ERROR: cannot drop table tbl because other objects depend on it DETAIL: default for table tbl_new column id depends on sequence tbl_id_seq
阅读http://www.postgresql.org/docs/9.1/static/sql-droptable.html后,看起来只有CASCADE和RESTRICT两种选项。

你是如何创建tbl_id_seq的?以及如何删除tbl?请提供一些代码。(我刚刚测试了它,对我来说运行得很好,所以问题很可能在这里没有提供的细节上。) - Angelo Fuchs
2个回答

6

您需要解耦序列和其“所属”的表格:

ALTER SEQUENCE "tbl_id_seq" OWNED BY NONE;

我认为它是通过将tbltbl_id字段定义为SERIAL自动创建和“绑定”的。


2

通过列默认值来查找序列及其依赖的所有表:

SELECT sn.nspname || '.' || s.relname AS seq
      ,tn.nspname || '.' || t.relname AS tbl
FROM   pg_class s
JOIN   pg_namespace sn ON sn.oid = s.relnamespace
LEFT   JOIN pg_depend d ON d.refobjid = s.oid AND d.deptype <> 'i'
LEFT   JOIN pg_attrdef ad ON ad.oid = d.objid
LEFT   JOIN pg_class t ON t.oid = ad.adrelid
LEFT   JOIN pg_namespace tn ON tn.oid = t.relnamespace
WHERE  s.relkind = 'S'
AND    s.relname ~~ '%part_of_seq_name%' -- enter search term here
ORDER  BY 1,2;

现在使用 LEFT JOIN 可以显示“自由序列”。
然后您可以使用@Milen发布的方法使序列成为“自由序列”。
我几天前发布了一个相关答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接