Тарифы Услуги Сим-карты

Truncate sql описание. Параметры или аргументы

Инструкция 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 не заносится в журнал, обычно она используется в базах данных, находящихся в процессе разработки. В рабочих базах данных ее нужно применять осторожно!

TABLE в хранимые процедуры или функции рабочего приложения, поскольку --- большинство платформ не журиалируют эту операцию и не смогут отменить неправильно поданную инструкцию.

Команда TRUNCATE TABLE не будет выполнена, если другой пользователь заблокировал таблицу в тот момент, когда команда была подана. Инструкция TRUNCATE TABLE не активизирует триггеры, но будет работать и при их наличии. Однако инструкция не сработает, если в данной таблице есть ограничения FOREIGN KEY.

DВ2

Версия 8 DB2 не поддерживает инструкцию TRUNCATE TABLE.

MySQL

Платформа 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 Удаляются все журналы-снимки.

Дисковое пространство, освободившееся при удалении рядов, высвобождается. REUSE STORAGE

Дисковое пространство, освободившееся при удалении рядов, остается закрепленным за данной таблицей. Например:

TRUNCATE TABLE scon. authors

PRESERVE SNAPSHOT LOG REUSE STORAGE

В этом примере удаляются все записи в таблице scott.authors. Сохраняется существующий журнал-снимок, и таблица может повторно использовать закрепленное за ней освободившееся место.

PostgreSQL

Платформа PostgreSQL мало отличается от сложившегося промышленного стандарта. Было добавлено ключевое слово TABLE.

TRUNCATE [ ONLY ] имя [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Описание

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

Параметры

имя

Имя таблицы (возможно, дополненное схемой), подлежащей опустошению. Если перед именем таблицы указано 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.5 .

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

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

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

Примеры

Опустошение таблиц bigtable и fattable:

TRUNCATE bigtable, fattable;

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

TRUNCATE bigtable, fattable RESTART IDENTITY;

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

TRUNCATE othertable CASCADE;

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

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