Em primeiro lugar, uma sequência criada automaticamente para uma coluna serial é excluída automaticamente , quando a coluna (ou tabela em que está) é excluída. O problema que você descreve não deveria existir para começar. Apenas muito versões antigas do PostgreSQL não faziam isso. 7.4 ou mais velho?
Solução para o problema:
Esta consulta irá gerar os comandos DDL para excluir todas as sequências "desvinculadas" no banco de dados ele é executado em:
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;
A conversão para
regclass
em c.oid::regclass
qualifica automaticamente os nomes de sequência quando necessário, de acordo com o search_path
atual . Ver:- Como verificar se existe uma tabela em um determinado esquema
- Como o search_path influencia a resolução do identificador e o "esquema atual"
Resultado:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Execute o resultado para descartar todas as sequências que não estão vinculadas a uma coluna serial (ou qualquer outra coluna). Estude o significado de colunas e tabelas aqui .
Cuidado no entanto! Ele não significa que essas sequências não estão em uso de outra forma. Há vários casos de uso em que as sequências são criadas como objetos independentes. Por exemplo, se você quiser que várias colunas compartilhem uma sequência. Você deve saber exatamente o que está fazendo.
No entanto, você não pode excluir sequências vinculadas a um
serial
coluna desta forma. Portanto, a operação é segura neste respeito. DROP SEQUENCE test_id_seq
Resultado:
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.