TRUNCATE TABLE (Transact-SQL)TRUNCATE TABLE (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Удаляет все строки в таблице или указанные секции таблицы, не записывая в журнал удаление отдельных строк.Removes all rows from a table or specified partitions of a table, without logging the individual row deletions. Инструкция TRUNCATE TABLE похожа на инструкцию DELETE без предложения WHERE, однако TRUNCATE TABLE выполняется быстрее и требует меньших ресурсов системы и журналов транзакций.TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.

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

СинтаксисSyntax

-- Syntax for SQL Server and Azure SQL Database  

TRUNCATE TABLE   
    [ { database_name .[ schema_name ] . | schema_name . } ]  
    table_name  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  

<range> ::=  
<partition_number_expression> TO <partition_number_expression>  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

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

АргументыArguments

database_namedatabase_name
Имя базы данных.Is the name of the database.

schema_nameschema_name
Имя схемы, которой принадлежит таблица.Is the name of the schema to which the table belongs.

table_nametable_name
Имя таблицы, которая должна быть усечена, или таблицы, из которой удаляются все строки.Is the name of the table to truncate or from which all rows are removed. table_name должно быть литералом.table_name must be a literal. table_name не может быть функцией OBJECT_ID() или переменной.table_name cannot be the OBJECT_ID() function or a variable.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до текущей версии)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

Указывает секции для усечения или секции, из которых удаляются все строки.Specifies the partitions to truncate or from which all rows are removed. Если таблица не секционирована, аргумент WITH PARTITIONS приведет к ошибке.If the table is not partitioned, the WITH PARTITIONS argument will generate an error. Если предложение WITH PARTITIONS не указано, будет усечена вся таблица.If the WITH PARTITIONS clause is not provided, the entire table will be truncated.

<partition_number_expression> можно указать одним из следующих способов:<partition_number_expression> can be specified in the following ways:

  • Указав номер секции, например WITH (PARTITIONS (2))Provide the number of a partition, for example: WITH (PARTITIONS (2))

  • Указав номера нескольких секций, разделив их запятыми, например WITH (PARTITIONS (1, 5))Provide the partition numbers for several individual partitions separated by commas, for example: WITH (PARTITIONS (1, 5))

  • Указав диапазоны секций и отдельные секции, например WITH (PARTITIONS (2, 4, 6 TO 8))Provide both ranges and individual partitions, for example: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> можно указать номерами секций, разделенными ключевым словом TO, например WITH (PARTITIONS (6 TO 8))<range> can be specified as partition numbers separated by the word TO, for example: WITH (PARTITIONS (6 TO 8))

    Для усечения секционированной таблицы таблицы и индексы должны быть выровнены (секционированы одной функцией секционирования).To truncate a partitioned table, the table and indexes must be aligned (partitioned on the same partition function).

RemarksRemarks

Инструкция TRUNCATE TABLE обладает следующими преимуществами по сравнению с инструкцией DELETE:Compared to the DELETE statement, TRUNCATE TABLE has the following advantages:

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

    Инструкция DELETE производит удаление по одной строке и заносит в журнал транзакций запись для каждой удаляемой строки.The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. Инструкция TRUNCATE TABLE удаляет данные, освобождая страницы данных, используемые для хранения данных таблиц, и в журнал транзакций записывает только данные об освобождении страниц.TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

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

    Если инструкция DELETE выполняется с блокировкой строк, для удаления блокируется каждая строка таблицы.When the DELETE statement is executed using a row lock, each row in the table is locked for deletion. Инструкция TRUNCATE TABLE всегда блокирует таблицу (включая блокировку схемы (SCH-M)) и страницу, но не каждую строку.TRUNCATE TABLE always locks the table (including a schema (SCH-M) lock) and page but not each row.

  • В таблице остается нулевое количество страниц, без исключений.Without exception, zero pages are left in the table.

    После выполнения инструкции DELETE в таблице могут все еще оставаться пустые страницы.After a DELETE statement is executed, the table can still contain empty pages. Например, чтобы освободить пустые страницы в куче, необходима, как минимум, монопольная блокировка таблицы (LCK_M_X).For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. Если операция удаления не использует блокировку таблицы, таблица (куча) будет содержать множество пустых страниц.If the delete operation does not use a table lock, the table (heap) will contain many empty pages. В индексах после операции удаления могут оказаться пустые страницы, хотя эти страницы будут быстро освобождены процессом фоновой очистки.For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.

    Инструкция TRUNCATE TABLE удаляет все строки таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т. п. сохраняются.TRUNCATE TABLE removes all rows from a table, but the table structure and its columns, constraints, indexes, and so on remain. Чтобы удалить не только данные таблицы, но и ее определение, следует использовать инструкцию DROP TABLE.To remove the table definition in addition to its data, use the DROP TABLE statement.

    Если таблица содержит столбец идентификаторов, счетчик этого столбца сбрасывается до начального значения, определенного для этого столбца.If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. Если начальное значение не задано, используется значение по умолчанию, равное 1.If no seed was defined, the default value 1 is used. Чтобы сохранить столбец идентификаторов, используйте инструкцию DELETE.To retain the identity counter, use DELETE instead.

ОграниченияRestrictions

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

  • На таблицу ссылается ограничение FOREIGN KEY.Are referenced by a FOREIGN KEY constraint. (Таблицу, имеющую внешний ключ, ссылающийся сам на себя, можно усечь.)(You can truncate a table that has a foreign key that references itself.)

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

  • Таблица опубликована с использованием репликации транзакций или репликации слиянием.Are published by using transactional replication or merge replication.

    Для таблиц с какими-либо из этих характеристик следует использовать инструкцию DELETE.For tables with one or more of these characteristics, use the DELETE statement instead.

    Инструкция TRUNCATE TABLE не может активировать триггер, поскольку она не записывает в журнал удаление отдельных строк.TRUNCATE TABLE cannot activate a trigger because the operation does not log individual row deletions. Дополнительные сведения см. в разделе CREATE TRIGGER (Transact-SQL).For more information, see CREATE TRIGGER (Transact-SQL).

    В Хранилище данных SQL AzureAzure SQL Data Warehouse и Параллельное хранилище данныхParallel Data Warehouse:In Хранилище данных SQL AzureAzure SQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse:

  • Инструкцию TRUNCATE TABLE нельзя использовать в инструкции EXPLAIN.TRUNCATE TABLE is not allowed within the EXPLAIN statement.

  • Инструкцию TRUNCATE TABLE невозможно выполнить внутри транзакции.TRUNCATE TABLE cannot be ran inside of a transaction.

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

В MicrosoftMicrosoft SQL ServerSQL Server существует возможность удалять или усекать таблицы, которые имеют больше 128 экстентов, не удерживая одновременные блокировки для всех экстентов, предназначенных для удаления. MicrosoftMicrosoft SQL ServerSQL Server has the ability to drop or truncate tables that have more than 128 extents without holding simultaneous locks on all the extents required for the drop.

РазрешенияPermissions

Минимально необходимым разрешением является ALTER для table_name.The minimum permission required is ALTER on table_name. Разрешения по умолчанию для инструкции TRUNCATE TABLE распространяются на владельца таблицы, членов предопределенной роли сервера sysadmin, а также предопределенных ролей базы данных db_owner и db_ddladmin. Эти разрешения не передаются.TRUNCATE TABLE permissions default to the table owner, members of the sysadmin fixed server role, and the db_owner and db_ddladmin fixed database roles, and are not transferable. Тем не менее инструкцию TRUNCATE TABLE можно встроить в модуль, например в хранимую процедуру, и предоставить соответствующие разрешения этому модулю с помощью предложения EXECUTE AS.However, you can incorporate the TRUNCATE TABLE statement within a module, such as a stored procedure, and grant appropriate permissions to the module using the EXECUTE AS clause.

ПримерыExamples

A.A. Усечение таблицыTruncate a Table

В ходе выполнения следующего примера удаляются все данные таблицы JobCandidate.The following example removes all data from the JobCandidate table. Инструкции SELECT включены до и после инструкции TRUNCATE TABLE для сравнения результатов.SELECT statements are included before and after the TRUNCATE TABLE statement to compare results.

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

Б.B. Усечение секций таблицыTruncate Table Partitions

Применимо к: SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) до текущей версии)Applies to: SQL ServerSQL Server ( SQL Server 2016 (13.x)SQL Server 2016 (13.x) through current version)

В следующем примере выполняется усечение указанных секций секционированной таблицы.The following example truncates specified partitions of a partitioned table. Синтаксис WITH (PARTITIONS (2, 4, 6 TO 8)) задает усечение секций с номерами 2, 4, 6, 7 и 8.The WITH (PARTITIONS (2, 4, 6 TO 8)) syntax causes partition numbers 2, 4, 6, 7, and 8 to be truncated.

TRUNCATE TABLE PartitionTable1   
WITH (PARTITIONS (2, 4, 6 TO 8));  
GO  

См. также:See Also

DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP TABLE (Transact-SQL) DROP TABLE (Transact-SQL)
Свойство IDENTITY (Transact-SQL)IDENTITY (Property) (Transact-SQL)