TRUNCATE
TRUNCATE — опустошить таблицу или набор таблиц
Синтаксис
TRUNCATE [ TABLE ] [ ONLY ] имя
[ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
Описание
Команда TRUNCATE
быстро удаляет все строки из набора таблиц. Она действует так же, как безусловная команда DELETE
для каждой таблицы, но гораздо быстрее, так как она фактически не сканирует таблицы. Более того, она немедленно высвобождает дисковое пространство, так что выполнять операцию VACUUM
после неё не требуется. Наиболее полезна она для больших таблиц.
Параметры
имя
Имя таблицы (возможно, дополненное схемой), подлежащей опустошению. Если перед именем таблицы указано
ONLY
, очищается только заданная таблица. БезONLY
очищается и заданная таблица, и все её потомки (если таковые есть). После имени таблицы можно также добавить необязательное указание*
, чтобы явно обозначить, что блокировка затрагивает и все дочерние таблицы.RESTART IDENTITY
Автоматически перезапускать последовательности, связанные со столбцами опустошаемой таблицы.
CONTINUE IDENTITY
Не изменять значения последовательностей. Это поведение по умолчанию.
CASCADE
Автоматически опустошать все таблицы, ссылающиеся по внешнему ключу на заданные таблицы, или на таблицы, затронутые в результате действия
CASCADE
.RESTRICT
Отказать в опустошении любых таблиц, на которые по внешнему ключу ссылаются другие таблицы, не перечисленные в этой команде. Это поведение по умолчанию.
Примечания
Чтобы опустошить таблицу, необходимо иметь право TRUNCATE
для этой таблицы.
Команда TRUNCATE
запрашивает блокировку ACCESS EXCLUSIVE
для каждой таблицы, которую она обрабатывает. Когда указано RESTART IDENTITY
, все последовательности, которые должны быть перезапущены, также блокируются исключительно. В случаях, когда требуется обеспечить параллельный доступ к таблице, следует использовать DELETE
.
TRUNCATE
нельзя использовать с таблицей, на которую по внешнему ключу ссылаются другие таблицы, если только и эти таблицы не опустошаются этой же командой. Проверка допустимости очистки в таких случаях потребовала бы сканирования таблицы, а главная идея данной команды в том, чтобы не делать этого. Для автоматической обработки всех зависимых таблиц можно использовать указание CASCADE
— но будьте очень осторожны с ним, иначе вы можете потерять данные, которые не собирались удалять! В частности, заметьте, что когда опустошаемая таблица является секцией, соседние секции эта операция не затрагивает, но затрагивает все таблицы, на которые ссылается целевая, или которые являются её секциями.
При выполнении TRUNCATE
не срабатывают никакие триггеры ON DELETE
, которые могут быть настроены для таблиц. Однако при этом срабатывают триггеры ON TRUNCATE
. Если триггеры ON TRUNCATE
определены для любых из этих таблиц, то все триггеры BEFORE TRUNCATE
срабатывают до того, как происходит опустошение, а все триггеры AFTER TRUNCATE
срабатывают после того, как завершается опустошение последней таблицы и все последовательности сбрасываются. Триггеры срабатывают по порядку обработки таблиц (сначала для таблиц, перечисленных в команде, затем для тех, что затрагиваются каскадно).
Команда TRUNCATE
небезопасна с точки зрения MVCC. После опустошения таблицы она будет выглядеть пустой для параллельных транзакций, если они работают со снимком, полученным до опустошения. За подробностями обратитесь к Разделу 13.6.
TRUNCATE
является надёжной транзакционной операцией в отношении данных в таблицах: опустошение будет безопасно отменено, если окружающая транзакция не будет зафиксирована.
С указанием RESTART IDENTITY
подразумеваемые операции ALTER SEQUENCE RESTART
также выполняются транзакционно; то есть, они будут отменены, если окружающая транзакция не будет зафиксирована. Учтите, что если до того, как транзакция отменится, будут выполнены какие-либо дополнительные операции с последовательностями, эффект этих операций также будет отменён, но не их влияние на значение currval()
; то есть после транзакции currval()
продолжит возвращать последнее значение последовательности, полученное внутри прерванной транзакции, хотя сама последовательность уже может быть несогласованной с ним. Подобным образом обычно ведёт себя currval()
после сбоя транзакции.
Команда TRUNCATE
может работать со сторонними таблицами, если это поддерживает обёртка сторонних данных, как например postgres_fdw.
Примеры
Опустошение таблиц bigtable
и fattable
:
TRUNCATE bigtable, fattable;
Та же операция и сброс всех связанных генераторов последовательностей:
TRUNCATE bigtable, fattable RESTART IDENTITY;
Опустошение таблицы othertable
и каскадная обработка всех таблиц, ссылающихся на othertable
по ограничениям внешнего ключа:
TRUNCATE othertable CASCADE;
Совместимость
Стандарт SQL:2008 включает команду TRUNCATE
с синтаксисом TRUNCATE TABLE
. Предложения имя_таблицы
CONTINUE IDENTITY
/RESTART IDENTITY
также описаны в стандарте, но с небольшими отличиями, хотя их назначение похоже. Поведение этой команды при параллельных операциях, согласно стандарту, отчасти определяются реализацией, так что приведённые выше замечания при необходимости следует учитывать и сопоставлять с другими реализациями.