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