TRUNCATE TABLE (Transact-SQL)

Удаляет все строки в таблице, не записывая в журнал удаление отдельных строк. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE, однако TRUNCATE TABLE выполняется быстрее и требует меньших ресурсов системы и журналов транзакций.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

TRUNCATE TABLE 
    [ { database_name .[ schema_name ] . | schema_name . } ]
    table_name
[ ; ]

Аргументы

  • database_name
    Имя базы данных.

  • schema_name
    Имя схемы, которой принадлежит таблица.

  • table_name
    Имя таблицы, которая должна быть усечена, или таблицы, из которой удаляются все строки. table_name должно быть литералом. table_name не может быть функцией OBJECT_ID() или переменной.

Замечания

Инструкция TRUNCATE TABLE обладает следующими преимуществами по сравнению с инструкцией DELETE:

  • Используется меньший объем журнала транзакций.

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

  • Обычно используется меньшее количество блокировок.

    Если инструкция DELETE выполняется с блокировкой строк, для удаления блокируется каждая строка таблицы. Инструкция TRUNCATE TABLE всегда блокирует таблицу (включая блокировку схемы (SCH-M)) и страницу, но не каждую строку.

  • В таблице остается нулевое количество страниц, без исключений.

    После выполнения инструкции DELETE в таблице могут все еще оставаться пустые страницы. Например, чтобы освободить пустые страницы в куче, необходима, как минимум, монопольная блокировка таблицы (LCK_M_X). Если операция удаления не использует блокировку таблицы, таблица (куча) будет содержать множество пустых страниц. В индексах после операции удаления могут оказаться пустые страницы, хотя эти страницы будут быстро освобождены процессом фоновой очистки.

Инструкция TRUNCATE TABLE удаляет все строки таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т. п. сохраняются. Чтобы удалить не только данные таблицы, но и ее определение, следует использовать инструкцию DROP TABLE.

Если таблица содержит столбец идентификаторов, счетчик этого столбца сбрасывается до начального значения, определенного для этого столбца. Если начальное значение не задано, используется значение по умолчанию, равное 1. Чтобы сохранить столбец идентификаторов, используйте инструкцию DELETE.

Ограничения

Инструкцию TRUNCATE TABLE нельзя использовать для таблиц, для которых выполняются следующие условия:

  • На таблицу ссылается ограничение FOREIGN KEY. (Таблицу, имеющую внешний ключ, ссылающийся сам на себя, можно усечь.)

  • Таблица является частью индексированного представления.

  • Таблица опубликована с использованием репликации транзакций или репликации слиянием.

Для таблиц с какими-либо из этих характеристик следует использовать инструкцию DELETE.

Инструкция TRUNCATE TABLE не может активировать триггер, поскольку она не записывает в журнал удаление отдельных строк. Дополнительные сведения см. в разделе CREATE TRIGGER (Transact-SQL).

Усечение больших таблиц

В Microsoft SQL Server существует возможность удалять или усекать таблицы, которые имеют больше 128 экстентов, не удерживая одновременные блокировки для всех экстентов, предназначенных для удаления.

Разрешения

Минимально необходимым разрешением является ALTER table_name. Разрешения TRUNCATE TABLE назначаются по умолчанию владельцу таблицы, членам предопределенной роли сервера sysadmin, а также предопределенных ролей базы данных db_owner и db_ddladmin, они не могут быть переданы. Тем не менее инструкцию TRUNCATE TABLE можно встроить в модуль, например в хранимую процедуру, и предоставить соответствующие разрешения этому модулю с помощью предложения EXECUTE AS.

Примеры

В ходе выполнения следующего примера удаляются все данные таблицы JobCandidate. Инструкции SELECT включены до и после инструкции TRUNCATE TABLE для сравнения результатов.

USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO

См. также

Справочник

DELETE (Transact-SQL)

DROP TABLE (Transact-SQL)

IDENTITY (свойство) (Transact-SQL)