PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como excluir sequências não utilizadas?


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:

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.