postgresql删除表

时间:2011-11-28 16:55:09

标签: postgresql

我有两个表(tbl和tbl_new)都使用相同的序列(tbl_id_seq)。我想放弃其中一张桌子。在tbl上,我删除了修饰符“not null default nextval('tbl_id_seq':: regclass)”,但该修饰符保留在tbl_new上。我收到以下错误:

错误:无法删除表tbl,因为其他对象依赖于它 DETAIL:表tbl_new列的默认值取决于序列tbl_id_seq

审核http://www.postgresql.org/docs/9.1/static/sql-droptable.html后 看起来只有CASCADE和RESTRICT作为选项。

2 个答案:

答案 0 :(得分:6)

您需要decouple序列及其“所属”的表格:

ALTER SEQUENCE "tbl_id_seq" OWNED BY NONE;

我认为通过将tbl_id的{​​{1}}字段定义为tbl来创建automatically(和“绑定”)。

答案 1 :(得分: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发布的方法使序列“独立”。

我几天前发布了related answer