Во-первых, последовательность, которая создается автоматически для последовательного столбца, автоматически удаляется , когда столбец (или таблица, в которой он находится) удаляется. Проблема, которую вы описываете, не должна существовать с самого начала. Только очень старых версий 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
. См:
Результат:
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.