TRUNCATE — очистка таблицы или набора таблиц
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATE быстро удаляет все строки из набора таблиц. Команда выполняет те же действия, что и безусловный оператор
DELETE для каждой таблицы, но поскольку она не сканирует таблицы, удаление происходит быстрее. Кроме того, она немедленно высвобождает дисковое пространство, не требуя выполнения последующей операции VACUUM
operation. Это наиболее эффективно для таблиц большого объема.
name
Имя таблицы (возможно, дополненное именем схемы) для очистки.
Если указано 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-безопасной. После очистки таблица будет выглядеть пустой для параллельных транзакций, если они используют моментальный снимок, сделанный до начала очистки. См. Раздел 2.10.6 для получения дополнительных сведений.
TRUNCATE является транзакционно-безопасной в отношении данных
в таблицах: операция очистки будет корректно отменена, если охватывающая
транзакция не будет зафиксирована.
При использовании RESTART IDENTITY указано, подразумеваемое
ALTER SEQUENCE RESTART операции также выполняются
транзакционно; то есть они будут отменены, если внешняя транзакция не будет зафиксирована. Следует учитывать, что если какие-либо дополнительные операции над перезапущенными последовательностями будут выполнены до отката транзакции, последствия этих операций для самих последовательностей будут отменены, но не их влияние на currval();
то есть после завершения транзакции currval() будет по-прежнему отражать последнее значение последовательности, полученное в рамках неудачной транзакции, даже если сама последовательность уже не будет ему соответствовать. Это аналогично обычному поведению currval() после
неудачной транзакции.
TRUNCATE может использоваться для сторонних таблиц, если
это поддерживается оберткой сторонних данных (FDW), например,
см. postgres_fdw.
Очистить таблицы bigtable и
fattable:
TRUNCATE bigtable, fattable;
То же действие, но со сбросом всех связанных генераторов последовательностей:
TRUNCATE bigtable, fattable RESTART IDENTITY;
Очистка таблицы othertable, с каскадным распространением операции на все таблицы,
ссылающиеся на данную othertable через ограничения
внешнего ключа:
TRUNCATE othertable CASCADE;
Стандарт SQL:2008 включает TRUNCATE команду
с синтаксисом TRUNCATE TABLE
. Предложения
tablenameCONTINUE IDENTITY/RESTART IDENTITY
также присутствуют в этом стандарте, но имеют несколько иные, хотя и смежные значения. Ряд аспектов поведения данной команды при параллельном доступе оставлен стандартом на усмотрение реализации, поэтому вышеизложенные примечания следует рассмотреть и при необходимости сравнить с другими реализациями.