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