Po pierwsze, sekwencja tworzona automatycznie dla kolumny szeregowej jest usuwana automatycznie , gdy kolumna (lub tabela, w której się znajduje) zostanie usunięta. Opisany przez Ciebie problem nie powinien istnieć. Tylko bardzo stare wersje PostgreSQL tego nie robiły. 7.4 lub starszy?
Rozwiązanie problemu:
To zapytanie wygeneruje polecenia DDL, aby usunąć wszystkie „niepowiązane” sekwencje w bazie danych jest wykonywany w:
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;
Rzut na regclass
w c.oid::regclass
w razie potrzeby automatycznie kwalifikuje nazwy sekwencji zgodnie z bieżącą search_path
. Zobacz:
- Jak sprawdzić, czy tabela istnieje w danym schemacie
- W jaki sposób search_path wpływa na rozpoznawanie identyfikatora i "bieżący schemat"
Wynik:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Wykonaj wynik, aby usunąć wszystkie sekwencje, które nie są powiązane z kolumną szeregową (lub żadną inną kolumną). Zapoznaj się z znaczeniem kolumn i tabel .
Ostrożnie chociaż! To nie oznacza, że te sekwencje nie są używane w inny sposób. Istnieje wiele przypadków użycia, w których sekwencje są tworzone jako samodzielne obiekty. Na przykład, jeśli chcesz, aby wiele kolumn współdzieliło jedną sekwencję. Powinieneś dokładnie wiedzieć, co robisz.
Jednak nie możesz usuń sekwencje powiązane z serial
kolumnę w ten sposób. Więc operacja jest bezpieczna w tym szacunek.
DROP SEQUENCE test_id_seq
Wynik:
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.