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)
演员要regclass在c.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)
| 归档时间: |
|
| 查看次数: |
9389 次 |
| 最近记录: |