For det første bliver en sekvens, der oprettes automatisk for en seriel kolonne, slettet automatisk , når kolonnen (eller tabellen den er i) er slettet. Det problem du beskriver burde ikke eksistere til at begynde med. Kun meget gamle versioner af PostgreSQL gjorde det ikke. 7.4 eller ældre?
Løsning på problemet:
Denne forespørgsel vil generere DDL-kommandoer for at slette alle "ubundne" sekvenser i databasen udføres det i:
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;
Castet til regclass
i c.oid::regclass
skema-kvalificerer automatisk sekvensnavne, hvor det er nødvendigt i henhold til den aktuelle search_path
. Se:
- Sådan kontrollerer du, om en tabel findes i et givet skema
- Hvordan påvirker søgestien identifikationsopløsning og det "aktuelle skema"
Resultat:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Udfør resultatet for at slette alle sekvenser, der ikke er bundet til en seriel kolonne (eller enhver anden kolonne). Undersøg betydningen af kolonner og tabeller her .
Forsigtig selvom! Det gør ikke betyder, at disse sekvenser ellers ikke er i brug. Der er en række use cases, hvor sekvenser oprettes som selvstændige objekter. For eksempel hvis du vil have flere kolonner til at dele en sekvens. Du bør vide præcis, hvad du laver.
Du kan dog ikke slet sekvenser bundet til en serial
kolonne på denne måde. Så operationen er sikker i denne respekt.
DROP SEQUENCE test_id_seq
Resultat:
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.