Ten eerste wordt een reeks die automatisch wordt gemaakt voor een seriële kolom automatisch verwijderd , wanneer de kolom (of tabel waarin deze zich bevindt) wordt verwijderd. Het probleem dat u beschrijft, zou om te beginnen niet moeten bestaan. Alleen zeer oude versies van PostgreSQL deden dat niet. 7.4 of ouder?
Oplossing voor het probleem:
Deze query genereert de DDL-commando's om alle "niet-gebonden" reeksen te verwijderen in de database wordt het uitgevoerd 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;
De cast naar regclass
in c.oid::regclass
automatisch schema-kwalificeert reeksnamen waar nodig volgens het huidige search_path
. Zie:
- Hoe te controleren of een tabel in een bepaald schema bestaat
- Hoe beïnvloedt het zoekpad de resolutie van de ID en het "huidige schema"
Resultaat:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Voer het resultaat uit om alle reeksen te verwijderen die niet zijn gebonden aan een seriële kolom (of een andere kolom). Bestudeer de betekenis van kolommen en tabellen hier .
Voorzichtig hoewel! Het doet niet betekenen dat die sequenties anders niet in gebruik zijn. Er zijn een aantal gebruikssituaties waarbij sequenties worden gemaakt als op zichzelf staande objecten. Bijvoorbeeld als u wilt dat meerdere kolommen één reeks delen. Je zou precies moeten weten wat je doet.
U kunt echter niet verwijder reeksen gebonden aan een serial
kolom op deze manier. Dus de operatie is veilig in dit respect.
DROP SEQUENCE test_id_seq
Resultaat:
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.