För det första, en sekvens som skapas automatiskt för en seriell kolumn raderas automatiskt , när kolumnen (eller tabellen den finns i) tas bort. Problemet du beskriver borde inte existera till att börja med. Bara mycket gamla versioner av PostgreSQL gjorde inte det. 7.4 eller äldre?
Lösning för problemet:
Den här frågan genererar DDL-kommandon för att ta bort alla "obundna" sekvenser i databasen körs 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;
Casten till regclass
i c.oid::regclass
schemakvalificerar automatiskt sekvensnamn vid behov enligt den aktuella search_path
. Se:
- Hur man kontrollerar om en tabell finns i ett givet schema
- Hur påverkar sökvägen identifierarens upplösning och det "aktuella schemat"
Resultat:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Kör resultatet för att ta bort alla sekvenser som inte är bundna till en seriell kolumn (eller någon annan kolumn). Studera innebörden av kolumner och tabeller här .
Försiktig fastän! Det gör det inte betyder att de sekvenserna inte används annars. Det finns ett antal användningsfall där sekvenser skapas som fristående objekt. Till exempel om du vill att flera kolumner ska dela en sekvens. Du bör veta exakt vad du gör.
Men du kan inte radera sekvenser bundna till en serial
kolumn på detta sätt. Så operationen är säker i denna 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.