TRUNCATE TABLE (Transact-SQL)
Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse w usłudze Microsoft FabricSQL Database w usłudze Microsoft Fabric
Usuwa wszystkie wiersze z tabeli lub określonych partycji tabeli bez rejestrowania pojedynczych operacji usuwania wierszy.
TRUNCATE TABLE
jest podobna do instrukcji DELETE
bez klauzuli WHERE
; jednak TRUNCATE TABLE
jest szybsza i używa mniejszej liczby zasobów dziennika systemu i transakcji.
Transact-SQL konwencje składni
Składnia
Składnia dla programu SQL Server, usługi Azure SQL Database, bazy danych SQL fabric
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>
Składnia usług Microsoft Fabric, Azure Synapse Analytics i Parallel Data Warehouse.
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Argumenty
database_name
Nazwa bazy danych.
schema_name
Nazwa schematu, do którego należy tabela.
table_name
Nazwa tabeli do obcinania lub usuwania wszystkich wierszy.
table_name musi być literałem.
table_name nie może być funkcją OBJECT_ID()
ani zmienną.
WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ... n ] ) )
Dotyczy: SQL Server 2016 (13.x) i nowszych wersjach.
Określa partycje, które mają zostać obcięte lub z których wszystkie wiersze są usuwane. Jeśli tabela nie jest partycjonowana, argument WITH PARTITIONS
generuje błąd. Jeśli nie podano klauzuli WITH PARTITIONS
, cała tabela zostanie obcięta.
<partition_number_expression>
można określić w następujący sposób:
Podaj liczbę partycji, na przykład:
WITH (PARTITIONS (2))
Podaj numery partycji dla kilku pojedynczych partycji rozdzielonych przecinkami, na przykład:
WITH (PARTITIONS (1, 5))
Podaj zarówno zakresy, jak i poszczególne partycje, na przykład:
WITH (PARTITIONS (2, 4, 6 TO 8))
<range>
można określić jako numery partycji oddzielone wyrazemTO
, na przykład:WITH (PARTITIONS (6 TO 8))
Aby obcinać tabelę partycjonowaną, należy wyrównać tabelę i indeksy (partycjonowane w tej samej funkcji partycji).
Uwagi
W porównaniu z instrukcją DELETE
TRUNCATE TABLE
ma następujące zalety:
Jest używana mniejsza ilość miejsca w dzienniku transakcji.
Instrukcja
DELETE
usuwa wiersze pojedynczo i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza.TRUNCATE TABLE
usuwa dane przez cofnięcie przydziału stron danych używanych do przechowywania danych tabeli i rejestruje tylko przydziały strony w dzienniku transakcji.Zwykle jest używana mniejsza liczba blokad.
Po wykonaniu instrukcji
DELETE
przy użyciu blokady wiersza każdy wiersz w tabeli jest zablokowany do usunięcia.TRUNCATE TABLE
zawsze blokuje tabelę (w tym schemat (SCH-M
) i stronę, ale nie każdy wiersz.Bez wyjątku strony zerowe pozostają w tabeli.
Po wykonaniu instrukcji
DELETE
tabela może nadal zawierać puste strony. Na przykład nie można cofnąć przydziału pustych stron w stercie bez co najmniej wyłącznego (LCK_M_X
) blokady tabeli. Jeśli operacja usuwania nie używa blokady tabeli, tabela (sterta) będzie zawierać wiele pustych stron. W przypadku indeksów operacja usuwania może pozostawić puste strony w tyle, chociaż proces oczyszczania w tle szybko cofa przydział tych stron.
TRUNCATE TABLE
usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy itd. pozostają. Aby usunąć definicję tabeli oprócz jej danych, użyj instrukcji DROP TABLE
.
Jeśli tabela zawiera kolumnę tożsamości, licznik dla tej kolumny zostanie zresetowany do wartości inicjatora zdefiniowanej dla kolumny. Jeśli nie zdefiniowano inicjatora, zostanie użyta wartość domyślna 1
. Aby zachować licznik tożsamości, użyj DELETE
zamiast tego.
Operację TRUNCATE TABLE
można wycofać w ramach transakcji.
W bazie danych SQL sieci szkieletowej obcinanie tabeli powoduje usunięcie wszystkich zdublowanych danych z usługi Fabric OneLake dla tej tabeli.
Ograniczenia
Nie można używać TRUNCATE TABLE
w tabelach, które:
Są przywoływane przez ograniczenie
FOREIGN KEY
. Możesz obcinać tabelę z kluczem obcym, który się odwołuje.Weź udział w widoku indeksowanym.
Są publikowane przy użyciu replikacji transakcyjnej lub replikacji scalania.
Są czasowo wersjonowane przez system.
Są przywoływane przez ograniczenie
EDGE
.
W przypadku tabel z co najmniej jedną z tych cech należy użyć instrukcji DELETE
.
TRUNCATE TABLE
nie można aktywować wyzwalacza, ponieważ operacja nie rejestruje pojedynczych usunięć wierszy. Aby uzyskać więcej informacji, zobacz CREATE TRIGGER (Transact-SQL).
W usłudze Azure Synapse Analytics and Analytics Platform System (PDW):
TRUNCATE TABLE
nie jest dozwolone w instrukcjiEXPLAIN
.TRUNCATE TABLE
nie można uruchomić wewnątrz transakcji.
Obcinanie dużych tabel
Program Microsoft SQL Server ma możliwość upuszczania lub obcinania tabel, które mają więcej niż 128 zakresów bez jednoczesnego przechowywania blokad we wszystkich zakresach wymaganych do upuszczania.
Uprawnienia
Minimalne wymagane uprawnienia są ALTER
w table_name.
TRUNCATE TABLE
uprawnienia domyślne do właściciela tabeli, członków stałej roli serwera sysadmin oraz db_owner i db_ddladmin stałych ról bazy danych i nie są przenoszone. Można jednak dołączyć instrukcję TRUNCATE TABLE
w module, taką jak procedura składowana, i udzielić odpowiednich uprawnień do modułu przy użyciu klauzuli EXECUTE AS
.
Przykłady
A. Obcinanie tabeli
Poniższy przykład usuwa wszystkie dane z tabeli JobCandidate
.
SELECT
instrukcje są uwzględniane przed i po instrukcji TRUNCATE TABLE
w celu porównania wyników.
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. Obcinanie partycji tabeli
Dotyczy: SQL Server 2016 (13.x) i nowszych wersjach.
Poniższy przykład obcina określone partycje tabeli partycjonowanej. Składnia WITH (PARTITIONS (2, 4, 6 TO 8))
powoduje obcięcie liczb partycji 2, 4, 6, 7 i 8.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
C. Wycofywanie operacji obcinania
W poniższym przykładzie pokazano, że można wycofać operację TRUNCATE TABLE
wewnątrz transakcji.
Utwórz tabelę testową z trzema wierszami.
USE [tempdb]; GO CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL); GO INSERT INTO TruncateTest DEFAULT VALUES; GO 3
Sprawdź dane przed obcięciem.
SELECT * FROM TruncateTest; GO
Obcinanie tabeli w ramach transakcji i sprawdzanie liczby wierszy.
BEGIN TRANSACTION; TRUNCATE TABLE TruncateTest; SELECT * FROM TruncateTest;
Zobaczysz, że tabela jest pusta.
Wycofaj transakcję i sprawdź dane.
ROLLBACK TRANSACTION; GO SELECT * FROM TruncateTest; GO
Zostaną wyświetlone wszystkie trzy wiersze.
Wyczyść tabelę.
DROP TABLE TruncateTest; GO