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:
- Come verificare se esiste una tabella in un determinato schema
- In che modo il percorso_ricerca influenza la risoluzione dell'identificatore e lo "schema corrente"
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.