我有两个表(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作为选项。
答案 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。