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

Hvordan sletter man ubrugte sekvenser?

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:

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.


  1. Tilslut Sys som Sysdba:Utilstrækkelige privilegier

  2. Søg efter navn i cx_Oracle

  3. Bestil efter faldende dato - måned, dag og år

  4. Aktiver Python for at oprette forbindelse til MySQL via SSH Tunneling