sql >> Databáze >  >> RDS >> PostgreSQL

Jak odstranit nepoužívané sekvence?

Za prvé, sekvence, která je automaticky vytvořena pro sériový sloupec, je automaticky odstraněna , když je sloupec (nebo tabulka, ve které se nachází) odstraněn. Problém, který popisujete, by zpočátku neměl existovat. Pouze velmi staré verze PostgreSQL to nedělaly. 7.4 nebo starší?

Řešení problému:

Tento dotaz vygeneruje příkazy DDL k odstranění všech „nevázaných“ sekvencí v databázi se provádí v:

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;

Odeslání do regclass v c.oid::regclass v případě potřeby automaticky kvalifikuje názvy sekvencí podle aktuálního search_path . Viz:

Výsledek:

DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...

Provedením výsledku zrušíte všechny sekvence, které nejsou vázány na sériový sloupec (nebo jakýkoli jiný sloupec). Prostudujte si význam sloupců a tabulek zde .

Pozor ačkoli! Není znamená, že tyto sekvence se jinak nepoužívají. Existuje řada případů použití, kdy jsou sekvence vytvořeny jako samostatné objekty. Například pokud chcete, aby více sloupců sdílelo jednu sekvenci. Měli byste přesně vědět, co děláte.

To však nemůžete odstranit sekvence vázané na serial sloupec tímto způsobem. Provoz je tedy v tomto bezpečný respekt.

DROP SEQUENCE test_id_seq

Výsledek:

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. Jak hromadně vkládat do mySql a node.js pomocí mysljs

  2. Akce GitHubu:Jak se připojit k Postgres v akcích GitHubu

  3. Jak vytvořit TimescaleDB Hypertable s časovým rozdělením na nejedinečné časové razítko?

  4. Jak upgradovat PostgreSQL 11 na PostgreSQL 12 s nulovým výpadkem