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