TRUNCATE#

TRUNCATE

TRUNCATE

TRUNCATE — очистить таблицу или набор таблиц

Синтаксис

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Описание

TRUNCATE быстро удаляет все строки из набора таблиц. Имеет тот же эффект, что и неквалифицированная команда DELETE для каждой таблицы, но поскольку она фактически не сканирует таблицы, то работает быстрее. Кроме того, команда немедленно восстанавливает дисковое пространство, а не требует последующей операции VACUUM. Это особенно применимо для больших таблиц.

Параметры

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

TRUNCATE безопасно для транзакций в отношении данных в таблицах: если окружающая транзакция не коммитится, обрезка будет безопасно отменена.

Когда указывается RESTART IDENTITY, также выполняются неявные операции ALTER SEQUENCE RESTART транзакционно; то есть они будут отменены, если окружающая транзакция не будет подтверждена. Имейте в виду, что если перед откатом транзакции на перезапущенных последовательностях выполняются дополнительные операции, то эффекты этих операций на последовательности будут отменены, но не их эффекты на currval(); то есть после транзакции currval() будет продолжать отражать последнее значение последовательности, полученное внутри неудавшейся транзакции, даже если сама последовательность больше не будет согласована с этим. Это аналогично обычному поведению currval() после неудавшейся транзакции.

TRUNCATE может использоваться для внешних таблиц, если поддерживается внешним оберткой данных, например, см. postgres_fdw.

Примеры

Очистить таблицы bigtable и fattable:

TRUNCATE bigtable, fattable;

То же самое, а также сбросить все связанные генераторы последовательностей:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Очистить таблицу othertable и каскадировать к любым таблицам, которые ссылаются на othertable через внешние ключи ограничения:

TRUNCATE othertable CASCADE;

Совместимость

Стандарт SQL:2008 включает команду TRUNCATE с синтаксисом TRUNCATE TABLE tablename. предложения CONTINUE IDENTITY/RESTART IDENTITY также присутствуют в этом стандарте, но имеют немного разные, но связанные значения. Некоторое поведение этой команды в отношении параллельности оставлено неопределенным в стандарте, поэтому вышеприведенные замечания следует учитывать и сравнивать с другими реализациями при необходимости.

См. также

DELETE