如何删除未使用的序列?

use*_*877 6 postgresql ddl sequences

我们正在使用PostgreSQL.我的要求是从我的数据库中删除未使用的序列.例如,如果我通过我的应用程序创建任何表,将创建一个序列,但是为了删除表,我们也不会删除序列.如果要创建同一个表,则会创建另一个序列.

示例:table : file; 自动创建idcoumn 序列:file_id_seq

当我删除表file并再次使用相同的名称创建它时,正在创建一个新序列(即file_id_seq1).我通过这种方式在应用程序数据库中积累了大量未使用的序列.

如何删除这些未使用的序列?

Erw*_*ter 15

首先,当删除列(或表所在的列)时,将自动删除为串行列自动创建的序列.您描述的问题不应该存在.只有非常旧版本的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;
Run Code Online (Sandbox Code Playgroud)

演员要regclassc.oid::regclass自动模式中,有资格在必要时根据当前序列的名字search_path.看到:

结果:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Run Code Online (Sandbox Code Playgroud)

执行结果以删除未绑定到串行列(或任何其他列)的所有序列.在这里研究列和表含义.

虽然小心!它并不意味着这些序列在不使用其他.有许多用例将序列创建为独立对象.例如,如果您希望多列共享一个序列.你应该确切地知道你在做什么.

但是,您无法serial这种方式删除绑定到列的序列.因此,方面的操作是安全的.

DROP SEQUENCE test_id_seq
Run Code Online (Sandbox Code Playgroud)

结果:

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.
Run Code Online (Sandbox Code Playgroud)