Как удалить неиспользуемые последовательности? - PullRequest
4 голосов
/ 25 ноября 2011

Мы используем PostgreSQL. Мое требование - удалить неиспользуемые последовательности из моей базы данных. Например, если я создаю какую-либо таблицу через свое приложение, будет создана одна последовательность, но для удаления таблицы мы также не удаляем последовательность. Если вы хотите создать ту же таблицу, создается другая последовательность.

Пример: таблица: file; автоматически созданная последовательность для id coumn: file_id_seq

Когда я удаляю таблицу file и снова создаю ее с тем же именем, создается новая последовательность (т. Е. file_id_seq1). Таким образом, я накопил огромное количество неиспользованных последовательностей в своей базе данных приложений.

Как удалить эти неиспользуемые последовательности?

Ответы [ 4 ]

13 голосов
/ 25 ноября 2011

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

Будьте осторожны, «drop sequence sequence_name_here» успешно удалит последовательность, даже если она прикреплена как значение nextval () по умолчанию для столбца таблицы. Кажется, здесь есть некоторое несоответствие, особенно если последовательность была создана отдельно. Я также ищу идеальный лайнер для очистки 100% неиспользованных последовательностей.

0 голосов
/ 26 ноября 2011

Сначала я получил все последовательности, а затем сохранил эти результаты в файл, затем запустил файл в psql: содержимое было сохранено с именем файла del_seq_all.sql , а затем перечислил последовательности в test1.sql .я не знаю, это правильное решение или нет.Но результат приходит, как и ожидалось.

\o d:/test1.sql
SELECT 'drop sequence ' || c.relname || ';' FROM pg_class c WHERE
(c.relkind = 'S');
\o

\i d:/test1.sql
0 голосов
/ 25 ноября 2011

Если вы используете pgAdmin, вы можете выбрать последовательность и проверить вкладку «зависит от». Он перечислит любой объект, который зависит от последовательности.

Другим способом является попытка удалить последовательность. Если таблица ссылается на нее, pgAdmin выдаст ошибку, сообщающую, что что-то зависит от этой последовательности. Если вы можете удалить последовательность без каких-либо ошибок, нет зависимости.

Обязательно проверьте это где-нибудь.

...