Първо, последователност, която се създава автоматично за серийна колона, се изтрива автоматично , когато колоната (или таблицата, в която се намира) е изтрита. Проблемът, който описвате, не би трябвало да съществува като начало. Само много старите версии на PostgreSQL не правеха това. 7.4 или по-стара?
Решение на проблема:
Тази заявка ще генерира DDL команди за изтриване на всички „необвързани“ последователности в базата данни се изпълнява в:
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;
Прехвърлянето към regclass
в c.oid::regclass
автоматично квалифицира схематично имена на последователности, където е необходимо, според текущия search_path
. Вижте:
- Как да проверя дали таблица съществува в дадена схема
- Как search_path влияе върху резолюцията на идентификатора и "текущата схема"
Резултат:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
Изпълнете резултата, за да премахнете всички последователности, които не са обвързани със серийна колона (или друга колона). Проучете значението на колоните и таблиците тук .
Внимателно все пак! Тонака означава, че тези последователности не се използват иначе. Има редица случаи на употреба, при които последователностите се създават като самостоятелни обекти. Например, ако искате няколко колони да споделят една последователност. Трябва да знаете точно какво правите.
Вие обаче не можете изтриване на последователности, обвързани с serial
колона по този начин. Така че операцията е безопасна в това уважение.
DROP SEQUENCE test_id_seq
Резултат:
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.