TRUNCATE
Эта страница переведена при помощи нейросети GigaChat.
TRUNCATE
- очищение таблицы или набора таблиц.
Синтаксис
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
Описание
TRUNCATE
быстро удаляет все строки из одного или нескольких таблиц. Она имеет тот же эффект, что и команда DELETE
без условий, но работает значительно быстрее, поскольку не сканирует таблицы, а просто очищает их содержимое. Кроме того, TRUNCATE
немедленно освобождает место на диске, в отличие от DELETE
, который требует последующего вызова VACUUM
.
Эта команда особенно полезна для больших таблиц.
Параметры
name
- Имя таблицы, при необходимости дополненное схемой. Если перед именем указано
ONLY
, будет очищена только сама таблица. ЕслиONLY
не указано, также очищаются все дочерние таблицы. Можно также указать*
после имени таблицы, чтобы явно включить дочерние таблицы.
RESTART IDENTITY
- Автоматически сбрасывает последовательности, связанные со столбцами очищаемых таблиц.
CONTINUE IDENTITY
- Не изменяет значения последовательностей. Это значение используется по умолчанию.
CASCADE
- Автоматически очищает все таблицы, которые имеют внешние ключи на любую из указанных таблиц
или на таблицы, добавленные в группу через
CASCADE
.
RESTRICT
- Отказывается очищать таблицу, если она имеет внешние ключи из других таблиц, не указанных в команде. Это поведение по умолчанию.
Примечания
Для использования команды TRUNCATE
у пользователя должны быть привилегии TRUNCATE
на соответствующие таблицы.
TRUNCATE
устанавливает блокировку уровня ACCESS EXCLUSIVE
на каждую затрагиваемую таблицу — это блокирует все другие параллельные операции с таблицей. Если необходим параллельный доступ, используйте команду DELETE
.
Нельзя использовать TRUNCATE
на таблице, на которую ссылаются внешние ключи, если только все такие таблицы не указаны в команде. Проверка таких ссылок требует сканирования таблиц, а цель TRUNCATE
— избежать этого. Можно использовать параметр CASCADE
, чтобы включить все зависимые таблицы автоматически — будьте осторожны, чтобы не потерять данные в других таблицах. Если очищается раздел таблицы, то другие разделы затронуты не будут, но каскадное удаление сработает по всем ссылающимся таблицам и их разделам — без исключений.
TRUNCATE
не вызывает триггеры ON DELETE
, но вызывает триггеры ON TRUNCATE
. Все BEFORE TRUNCATE
триггеры срабатывают до очистки,
а все AFTER TRUNCATE
— после очистки последней таблицы и сброса последовательностей.
TRUNCATE
не безопасна с точки зрения MVCC.
После очистки таблица будет казаться пустой для параллельных транзакций, даже если они используют снимки, сделанные до очистки. С точки зрения данных, TRUNCATE
безопасна в транзакциях — ее можно откатить при ROLLBACK
.
Если используется RESTART IDENTITY
, то сбросы последовательностей также происходят транзакционно. Однако, стоит учесть, что вызовы currval()
внутри транзакции будут помнить последнее значение, даже если сама последовательность была откатана.
TRUNCATE
можно использовать и для внешних таблиц, если это поддерживается используемым адаптером (например, postgres_fdw).
Примеры
Очистка таблиц bigtable
и fattable
:
TRUNCATE bigtable, fattable;
Та же операция и сброс всех связанных генераторов последовательностей:
TRUNCATE bigtable, fattable RESTART IDENTITY;
Очистка таблицы othertable
и каскадная обработка всех таблиц, ссылающихся на othertable
по ограничениям внешнего ключа:
TRUNCATE othertable CASCADE;
Совместимость
Стандарт SQL:2008 включает команду TRUNCATE TABLE tablename
. Параметры CONTINUE IDENTITY
и RESTART IDENTITY
также присутствуют в стандарте, однако в стандарте они имеют несколько иное поведение.
Некоторые особенности поведения TRUNCATE
, связанные с параллелизмом, оставлены на усмотрение реализации, поэтому стоит внимательно сравнивать поведение PostgreSQL с другими СУБД, если это критично.