PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment supprimer les séquences inutilisées ?

Tout d'abord, une séquence créée automatiquement pour une colonne en série est supprimée automatiquement , lorsque la colonne (ou la table dans laquelle elle se trouve) est supprimée. Le problème que vous décrivez ne devrait pas exister pour commencer. Seulement très les anciennes versions de PostgreSQL ne le faisaient pas. 7.4 ou version antérieure ?

Solution au problème :

Cette requête générera les commandes DDL pour supprimer toutes les séquences "non liées" dans la base de données où il est exécuté :

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;

Le cast en regclass dans c.oid::regclass qualifie automatiquement le schéma des noms de séquence si nécessaire en fonction du search_path actuel . Voir :

Résultat :

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Exécutez le résultat pour supprimer toutes les séquences qui ne sont pas liées à une colonne en série (ou à toute autre colonne). Étudiez la signification des colonnes et des tableaux ici .

Attention pourtant! Ce n'est pas signifient que ces séquences ne sont pas utilisées autrement. Il existe un certain nombre de cas d'utilisation où les séquences sont créées en tant qu'objets autonomes. Par exemple, si vous souhaitez que plusieurs colonnes partagent une séquence. Vous devez savoir exactement ce que vous faites.

Cependant, vous ne pouvez pas supprimer les séquences liées à un serial colonne de cette façon. Donc l'opération est sûre dans ceci respecter.

DROP SEQUENCE test_id_seq

Résultat :

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.