自动创建的序列serial
列是自动删除,当列(或其表)被删除时。你所描述的问题一开始就不应该存在。仅有的very旧版本的 PostgreSQL 没有这样做。 7.4 或更早版本?
问题的解决方案
该查询将生成用于删除所有“未绑定”序列的 DDL 命令在数据库中执行:
SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM pg_class c
LEFT JOIN pg_depend d ON d.refobjid = c.oid
AND d.deptype <> 'i'
WHERE c.relkind = 'S'
AND d.refobjid IS NULL;
演员阵容regclass
in c.oid::regclass
根据当前的需要,自动对序列名称进行模式限定search_path
. See:
- 如何检查给定模式中是否存在表
- search_path 如何影响标识符解析和“当前模式”
Result:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
执行结果以删除未绑定到串行列(或任何其他列)的所有序列。在这里研究一下列和表的含义。
Careful!这些序列可能会以其他方式使用。在某些用例中,序列被创建为独立对象。例如,如果您希望多列共享一个序列。你应该确切地知道你在做什么。
然而,你cannot删除绑定到 a 的序列serial
专栏这样。所以操作是安全的this尊重。
DROP SEQUENCE test_id_seq;
Result:
ERROR: cannot drop sequence test_id_seq because other objects depend on it
DETAIL: default for table test column id depends on sequence test_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.