Инструкция TRUNCATE TABLE
Инструкция TRUNCATE TABLE — это инструкция, не входящая в стандарт ANSI, которая необратимо удаляет все строки из таблицы без занесения в журнал удаления отдельных строк. Эта инструкция быстро удаляет все записи из таблицы, не влияя на структуру таблицы и не занимая или занимая очень мало места в журналах отката или журналах транзакций. Однако, поскольку данная операция не журналируется, инструкцию TRUNCATE TABLE нельзя отменить после выполнения.
Стандартный синтаксис de facto
Официально инструкция TRUNCATE TABLE не является стандартной командой ANSI. Однако есть стандарт, который поддерживают платформы и который имеет следующий формат.
TRUNCATE TABLE имя_таблицы
имя_таблицы
Имя любой таблицы в текущей базе данных или схеме.
Инструкция TRUNCATE TABLE оказывает то же действие, что и инструкция DELETE без предложения WHERE. Обе инструкции удаляют все строки в данной таблице. Однако есть два важных отличия. Инструкция TRUNCATE TABLE работает быстрее и не журналируется, что означает невозможность отката в случае ошибки. Кроме того, инструкция TRUNCATE TABLE не активирует триггеры, в то время как DELETE активирует их.
Эту команду следует подавать вручную. Мы настоятельно не рекомендуем использовать ее в скриптах или работающих системах, которые содержат невосстановимые данные. Ее нельзя использовать совместно с инструкциями, управляющими транзакциями, такими, как BEGIN TRAN и COMMIT.
Советы и хитрости программирования
Поскольку инструкция TRUNCATE TABLE не заносится в журнал, обычно она используется в базах данных, находящихся в процессе разработки. В рабочих базах данных ее нужно применять осторожно!
Мы настоятельно не рекомендуем вставлять инструкцию TRUNCATE
TABLE в хранимые процедуры или функции рабочего приложения, поскольку — большинство платформ не журиалируют эту операцию и не смогут отменить неправильно поданную инструкцию.
Команда TRUNCATE TABLE не будет выполнена, если другой пользователь заблокировал таблицу в тот момент, когда команда была подана. Инструкция TRUNCATE TABLE не активизирует триггеры, но будет работать и при их наличии. Однако инструкция не сработает, если в данной таблице есть ограничения FOREIGN KEY.
Версия 8 DB2 не поддерживает инструкцию TRUNCATE TABLE.
Платформа MySQL, начиная с версии 3.23, поддерживает базовый формат инструкции TRUNCATE TABLE.
TRUNCATE TABLE имя
Платформа MySQL получает нужный результат путем удаления и повторного создания указанной таблицы. Поскольку MySQL хранит каждую таблицу в файле с именем имя./гт, то для правильной работы команды файл с этим именем должен существовать в директории, содержащей файлы базы данных.
Например, следующая инструкция удалит все данные из таблицы publishers.
TRUNCATE TABLE publishers
Платформа Oracle позволяет удалить таблицу или индексированный кластер (но не хеш-кластер). Синтаксис следующий.
TRUNCATE {CLUSTER [владелец.]кластер |
TABLE [владелец_таблица [{PRESERVE | PURGE} MATERIALIZED VIEW LOG]} [{DROP | REUSE} STORAGE]
Инструкция TRUNCATE TABLE впервые появилась на платформе Oracle, и другие производители вскоре ввели поддержку этой инструкции. В Oracle к этой инструкции были добавлены дополнительные возможности, которые часто поддерживаются другими производителями.
Синтаксические элементы в Oracle следующие
CLUSTER | TABLE
Указывается, будет удаляться индексированный кластер или таблица. Индексированный кластер — это конструкция, которая хранит связанные строки двух таблиц физически на диске рядом друг с другом для ускорения соединения путем уменьшения нагрузки на каналы ввода-вывода. При удалении индексированного кластера нельзя использовать такие опции, как SNAPSHOT LOG и STORAGE.
PRESERVE MA TERIALIZED VIEWLOG
При удалении основной таблицы сохраняются все журналы-снимки.
PURGE MATERIALIZED VIEW LOG Удаляются все журналы-снимки.
DROP STORAGE
Дисковое пространство, освободившееся при удалении рядов, высвобождается. REUSE STORAGE
Дисковое пространство, освободившееся при удалении рядов, остается закрепленным за данной таблицей. Например:
TRUNCATE TABLE scon. authors
PRESERVE SNAPSHOT LOG REUSE STORAGE
В этом примере удаляются все записи в таблице scott.authors. Сохраняется существующий журнал-снимок, и таблица может повторно использовать закрепленное за ней освободившееся место.
Платформа PostgreSQL мало отличается от сложившегося промышленного стандарта. Было добавлено ключевое слово TABLE.
TRUNCATE [TABLET имя
Ключевое слово TABLE является необязательным. Например, следующая команда удаляет все записи из таблицы authors базы данных PostgreSQL.
TRUNCATE autners
Платформа SQL Server поддерживает сложившийся de facto промышленный стандарт. Смотрите также
DELETE