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:
- Jak zkontrolovat, zda tabulka v daném schématu existuje
- Jak parametr search_path ovlivňuje rozlišení identifikátoru a "aktuální schéma"
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.