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