TRUNCATE TABLE (Transact-SQL)
platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse v Microsoft Fabricdatabázi SQL v Microsoft Fabric
Odebere všechny řádky z tabulky nebo zadané oddíly tabulky bez protokolování odstranění jednotlivých řádků.
TRUNCATE TABLE
se podobá příkazu DELETE
bez klauzule WHERE
; ale TRUNCATE TABLE
je rychlejší a používá méně systémových a transakčních protokolů prostředků.
Syntax
Syntaxe pro SQL Server, Azure SQL Database, Databázi Fabric SQL
TRUNCATE TABLE
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
[ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ) ]
[ ; ]
<range> ::=
<partition_number_expression> TO <partition_number_expression>
Syntaxe pro Microsoft Fabric, Azure Synapse Analytics a Paralelní datový sklad
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Argumenty
database_name
Název databáze.
schema_name
Název schématu, do kterého tabulka patří.
table_name
Název tabulky, která se má zkrátit nebo ze které se odeberou všechny řádky.
table_name musí být literál.
table_name nemůže být funkce OBJECT_ID()
ani proměnná.
WITH ( PARTITIONS ( { <partition_number_expression> | <rozsah> } [ , ... n ] ) )
platí pro: SQL Server 2016 (13.x) a novější verze.
Určuje oddíly, které se mají zkrátit nebo ze kterých se odeberou všechny řádky. Pokud tabulka není rozdělená na oddíly, WITH PARTITIONS
argument vygeneruje chybu. Pokud není zadanou klauzulí WITH PARTITIONS
, zkrátí se celá tabulka.
<partition_number_expression>
lze zadat následujícími způsoby:
Zadejte počet oddílů, například:
WITH (PARTITIONS (2))
Zadejte čísla oddílů pro několik jednotlivých oddílů oddělených čárkami, například:
WITH (PARTITIONS (1, 5))
Zadejte rozsahy i jednotlivé oddíly, například:
WITH (PARTITIONS (2, 4, 6 TO 8))
<range>
lze zadat jako čísla oddílů oddělená slovemTO
, například:WITH (PARTITIONS (6 TO 8))
Pokud chcete zkrátit dělenou tabulku, musí být tabulky a indexy zarovnané (dělené podle stejné funkce oddílu).
Poznámky
V porovnání s příkazem DELETE
má TRUNCATE TABLE
následující výhody:
Použije se méně místa transakčního protokolu.
Příkaz
DELETE
odebere řádky po jednom a zaznamená položku v transakčním protokolu pro každý odstraněný řádek.TRUNCATE TABLE
odebere data uvolněním datových stránek použitých k uložení dat tabulky a zaznamenává pouze přidělení stránek v transakčním protokolu.Obvykle se používá méně zámků.
Když se příkaz
DELETE
spustí pomocí zámku řádku, je každý řádek v tabulce uzamčen pro odstranění.TRUNCATE TABLE
vždy uzamkne tabulku (včetně zámku schématu (SCH-M
) a stránku, ale ne každý řádek.Bez výjimky zůstanou v tabulce nulové stránky.
Po provedení příkazu
DELETE
může tabulka stále obsahovat prázdné stránky. Například prázdné stránky v haldě nelze uvolnit bez alespoň výhradního zámku tabulky (LCK_M_X
). Pokud operace odstranění nepoužívá zámek tabulky, bude tabulka (halda) obsahovat mnoho prázdných stránek. U indexů může operace odstranění ponechat prázdné stránky za sebou, i když proces čištění na pozadí tyto stránky rychle uvolní.
TRUNCATE TABLE
odebere všechny řádky z tabulky, ale struktura tabulky a její sloupce, omezení, indexy atd., zůstanou. Pokud chcete kromě dat odebrat definici tabulky, použijte příkaz DROP TABLE
.
Pokud tabulka obsahuje sloupec identity, je čítač pro tento sloupec resetován na počáteční hodnotu definovanou pro sloupec. Pokud nebyla definována žádná počáteční hodnota, použije se výchozí hodnota, 1
. Pokud chcete zachovat čítač identity, použijte místo toho DELETE
.
Operaci TRUNCATE TABLE
lze vrátit zpět v rámci transakce.
Ve službě Fabric SQL Database se zkrácením tabulky odstraní všechna zrcadlená data z Fabric OneLake pro danou tabulku.
Omezení
Nemůžete použít TRUNCATE TABLE
u tabulek, které:
Odkazuje se na omezení
FOREIGN KEY
. Můžete zkrátit tabulku, která obsahuje cizí klíč, který odkazuje sám na sebe.Zapojte se do indexovaného zobrazení.
Publikují se pomocí transakční replikace nebo slučovací replikace.
Jsou časové verze systému.
Odkazuje se na omezení
EDGE
.
Pro tabulky s jednou nebo více z těchto charakteristik použijte místo toho příkaz DELETE
.
TRUNCATE TABLE
aktivační událost nejde aktivovat, protože operace nezapíše odstranění jednotlivých řádků. Další informace naleznete v tématu CREATE TRIGGER (Transact-SQL).
Ve službě Azure Synapse Analytics a Platform Platform System (PDW):
TRUNCATE TABLE
není v příkazuEXPLAIN
povolený.TRUNCATE TABLE
nelze spustit uvnitř transakce.
Zkrácení velkých tabulek
Microsoft SQL Server má možnost vypustit nebo zkrátit tabulky, které mají více než 128 rozsahů bez současného uzamčení ve všech rozsahech potřebných pro pokles.
Dovolení
Minimální požadovaná oprávnění se ALTER
na table_name.
TRUNCATE TABLE
oprávnění výchozí pro vlastníka tabulky, členy pevné role serveru správce systému a db_owner a db_ddladmin pevné databázové role a nejsou přenositelné. Příkaz TRUNCATE TABLE
však můžete začlenit do modulu, například uloženou proceduru, a udělit modulu příslušná oprávnění pomocí klauzule EXECUTE AS
.
Příklady
A. Zkrácení tabulky
Následující příklad odebere všechna data z tabulky JobCandidate
.
SELECT
příkazy jsou zahrnuty před a za příkazem TRUNCATE TABLE
pro porovnání výsledků.
USE AdventureWorks2022;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;
GO
B. Zkrácení oddílů tabulky
platí pro: SQL Server 2016 (13.x) a novější verze.
Následující příklad zkrátí zadané oddíly dělené tabulky. Syntaxe WITH (PARTITIONS (2, 4, 6 TO 8))
způsobí zkrácení čísel oddílů 2, 4, 6, 7 a 8.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
C. Vrácení operace zkrácení zpět
Následující příklad ukazuje, že operace TRUNCATE TABLE
uvnitř transakce lze vrátit zpět.
Vytvořte testovací tabulku se třemi řádky.
USE [tempdb]; GO CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL); GO INSERT INTO TruncateTest DEFAULT VALUES; GO 3
Před zkrácením zkontrolujte data.
SELECT * FROM TruncateTest; GO
Zkrátte tabulku v rámci transakce a zkontrolujte počet řádků.
BEGIN TRANSACTION; TRUNCATE TABLE TruncateTest; SELECT * FROM TruncateTest;
Vidíte, že tabulka je prázdná.
Vrácení transakce zpět a kontrola dat.
ROLLBACK TRANSACTION; GO SELECT * FROM TruncateTest; GO
Zobrazí se všechny tři řádky.
Vyčistěte tabulku.
DROP TABLE TruncateTest; GO
Související obsah
-
DELETE (Transact-SQL) -
DROP TABLE (Transact-SQL) -
CREATE TABLE (Transact-SQL) IDENTITY (vlastnost)