TRUNCATE
TRUNCATE — опустошить таблицу или набор таблиц
Синтаксис
TRUNCATE [ TABLE ] [ ONLY ] имя [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
Описание
Команда TRUNCATE
быстро удаляет все строки из набора таблиц. Она действует так
же, как и команда DELETE
, выполненная без дополнительных определений для каждой
заданной таблицы, но поскольку команда TRUNCATE
на самом деле не сканирует
таблицы, она быстрее. Более того, она сразу же освобождает место на диске и не
требует последующей операции 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. После опустошения
таблица будет выглядеть пустой для параллельных транзакций, если они используют
снимок, сделанный до того, как произошло опустошение. Более подробную информацию
см. в разделе Ограничения применимости.
Команда 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 тоже включены в
стандарт, но имеют несколько другое, хотя и похожее назначение. Согласно стандарту,
поведение этой команды при параллельных операциях отчасти определяется реализацией,
поэтому при необходимости вышеуказанные примечания следует рассматривать и
сопоставлять с другими реализациями.