sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo eliminar secuencias no utilizadas?

En primer lugar, una secuencia que se crea automáticamente para una columna en serie se elimina automáticamente , cuando se elimina la columna (o la tabla en la que se encuentra). Para empezar, el problema que describes no debería existir. Solo muy las versiones antiguas de PostgreSQL no hacían eso. ¿7.4 o anterior?

Solución al problema:

Esta consulta generará los comandos DDL para eliminar todas las secuencias "desvinculadas" en la base de datos se ejecuta en:

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;

El elenco a regclass en c.oid::regclass califica automáticamente los nombres de secuencia según el esquema cuando sea necesario de acuerdo con el search_path actual . Ver:

Resultado:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Ejecute el resultado para eliminar todas las secuencias que no están vinculadas a una columna en serie (o cualquier otra columna). Estudie el significado de columnas y tablas aquí .

Cuidado ¡aunque! no significa que esas secuencias no están en uso de otra manera. Hay una serie de casos de uso en los que las secuencias se crean como objetos independientes. Por ejemplo, si desea que varias columnas compartan una secuencia. Debes saber exactamente lo que estás haciendo.

Sin embargo, no puede eliminar secuencias vinculadas a un serial columna de esta manera. Entonces la operación es segura en este respeto.

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.