PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eliminare le sequenze inutilizzate?

Innanzitutto, una sequenza creata automaticamente per una colonna seriale viene eliminata automaticamente , quando la colonna (o la tabella in cui si trova) viene eliminata. Il problema che descrivi non dovrebbe esistere per cominciare. Solo molto le vecchie versioni di PostgreSQL non lo facevano. 7.4 o precedenti?

Soluzione per il problema:

Questa query genererà i comandi DDL per eliminare tutte le sequenze "non associate" nel database viene eseguito in:

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;

Il cast di regclass in c.oid::regclass qualifica automaticamente lo schema i nomi delle sequenze ove necessario in base al search_path corrente . Vedi:

Risultato:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Esegui il risultato per eliminare tutte le sequenze che non sono associate a una colonna seriale (o qualsiasi altra colonna). Studia il significato di colonne e tabelle qui .

Attento anche se! non significa che quelle sequenze non sono in uso altrimenti. Esistono numerosi casi d'uso in cui le sequenze vengono create come oggetti autonomi. Ad esempio, se desideri che più colonne condividano una sequenza. Dovresti sapere esattamente cosa stai facendo.

Tuttavia, non puoi elimina le sequenze legate a un serial colonna in questo modo. Quindi l'operazione è sicura in questo rispetto.

DROP SEQUENCE test_id_seq

Risultato:

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.