TRUNCATE

TRUNCATE — очистить таблицу или набор таблиц

Синтаксис

TRUNCATE [ TABLE ] [ ONLY ] имя [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Описание

Команда TRUNCATE быстро удаляет все строки из набора таблиц (очищает таблицу). Она действует так же, как и выполненная без условий команда DELETE для каждой заданной таблицы, но поскольку команда TRUNCATE фактически не сканирует таблицы, она быстрее. Более того, она сразу же освобождает место на диске и не требует последующей операции VACUUM. Это наиболее удобно на больших таблицах.

Параметры

имя

Имя таблицы для очищения (может быть дополнено схемой). Если перед именем таблицы указывается ONLY, то очищается только эта таблица. Если ONLY не указано, очищаются таблица и все ее потомки (если таковые имеются). После имени таблицы можно добавить необязательное указание *, чтобы явно обозначить, что включены дочерние таблицы.

RESTART IDENTITY

Автоматически перезапускать последовательности, принадлежащие столбцам очищаемой(ых) таблиц(ы).

CONTINUE IDENTITY

Не изменять значения последовательностей. Это поведение по умолчанию.

CASCADE

Автоматически выполнять TRUNCATE для всех таблиц, имеющих ссылки по внешнему ключу на любую из заданных таблиц или на любые таблицы, затронутые в результате действия 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 не поддерживается для сторонних таблиц. Это означает, что если у указанной таблицы есть какие-либо дочерние таблицы, которые являются сторонними, команда завершится ошибкой.

Примеры

Очищение таблиц bigtable и fattable:

TRUNCATE bigtable, fattable;

Та же операция и сброс любых связанных генераторов последовательностей:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Очищение таблицы othertable и каскадная обработка таблиц, которые ссылаются на othertable через ограничения внешнего ключа:

TRUNCATE othertable CASCADE;

Совместимость

Стандарт SQL:2008 включает команду TRUNCATE с синтаксисом TRUNCATE TABLE имя_таблицы. Предложения CONTINUE IDENTITY/RESTART IDENTITY также включены в стандарт, но имеют несколько другое, хотя и похожее назначение. Согласно стандарту, поведение этой команды при параллельных операциях определяется реализацией, поэтому при необходимости вышеуказанные примечания следует рассматривать и сопоставлять с другими реализациями.

См. также

DELETE