Перейти к основному содержимому

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 с другими СУБД, если это критично.

Смотрите также

DELETE