TRUNCATE TABLE (Transact-SQL)
Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Warehouse in Microsoft FabricSQL-database in Microsoft Fabric
Verwijdert alle rijen uit een tabel of opgegeven partities van een tabel, zonder de afzonderlijke rijverwijderingen te registreren.
TRUNCATE TABLE
is vergelijkbaar met de DELETE
-instructie zonder WHERE
component; TRUNCATE TABLE
is echter sneller en maakt gebruik van minder systeem- en transactielogboekbronnen.
Transact-SQL syntaxisconventies
Syntaxis
Syntaxis voor SQL Server, Azure SQL Database, Fabric SQL-database
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>
Syntaxis voor Microsoft Fabric, Azure Synapse Analytics en Parallel Data Warehouse.
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]
Argumenten
database_name
De naam van de database.
schema_name
De naam van het schema waartoe de tabel behoort.
table_name
De naam van de tabel die moet worden afgekapt of waaruit alle rijen worden verwijderd.
table_name moet een letterlijke naam zijn.
table_name kan de OBJECT_ID()
functie of een variabele niet zijn.
WITH ( PARTITIES ( { <partition_number_expression> | <bereik> } [ , ... n ] ) )
Van toepassing op: SQL Server 2016 (13.x) en latere versies.
Hiermee geeft u de partities afkappen of waaruit alle rijen worden verwijderd. Als de tabel niet is gepartitioneerd, genereert het argument WITH PARTITIONS
een fout. Als de WITH PARTITIONS
component niet is opgegeven, wordt de hele tabel afgekapt.
<partition_number_expression>
kunt u op de volgende manieren opgeven:
Geef het aantal partities op, bijvoorbeeld:
WITH (PARTITIONS (2))
Geef de partitienummers op voor verschillende afzonderlijke partities, gescheiden door komma's, bijvoorbeeld:
WITH (PARTITIONS (1, 5))
Geef zowel bereiken als afzonderlijke partities op, bijvoorbeeld:
WITH (PARTITIONS (2, 4, 6 TO 8))
<range>
kan worden opgegeven als partitienummers gescheiden door het woordTO
, bijvoorbeeld:WITH (PARTITIONS (6 TO 8))
Als u een gepartitioneerde tabel wilt afkappen, moeten de tabel en indexen worden uitgelijnd (gepartitioneerd op dezelfde partitiefunctie).
Opmerkingen
In vergelijking met de DELETE
-instructie heeft TRUNCATE TABLE
de volgende voordelen:
Er wordt minder transactielogboekruimte gebruikt.
De instructie
DELETE
verwijdert rijen één voor één en registreert een vermelding in het transactielogboek voor elke verwijderde rij.TRUNCATE TABLE
verwijdert de gegevens door de gegevenspagina's die worden gebruikt om de tabelgegevens op te slaan en alleen de pagina-deallocaties in het transactielogboek te registreren.Er worden doorgaans minder vergrendelingen gebruikt.
Wanneer de instructie
DELETE
wordt uitgevoerd met behulp van een rijvergrendeling, wordt elke rij in de tabel vergrendeld voor verwijdering.TRUNCATE TABLE
vergrendelt altijd de tabel (inclusief een schemavergrendeling (SCH-M
) en pagina, maar niet elke rij.Zonder uitzondering worden er nul pagina's in de tabel achtergelaten.
Nadat een
DELETE
instructie is uitgevoerd, kan de tabel nog steeds lege pagina's bevatten. Lege pagina's in een heap kunnen bijvoorbeeld niet ongedaan worden gemaakt zonder ten minste een exclusieve (LCK_M_X
) tabelvergrendeling. Als de verwijderbewerking geen tabelvergrendeling gebruikt, bevat de tabel (heap) veel lege pagina's. Voor indexen kan de verwijderbewerking lege pagina's achter laten, hoewel de toewijzing van deze pagina's snel ongedaan wordt gemaakt door een opschoonproces op de achtergrond.
TRUNCATE TABLE
verwijdert alle rijen uit een tabel, maar de tabelstructuur en de bijbehorende kolommen, beperkingen, indexen, enzovoort, blijven behouden. Als u de tabeldefinitie naast de gegevens wilt verwijderen, gebruikt u de DROP TABLE
-instructie.
Als de tabel een identiteitskolom bevat, wordt de teller voor die kolom opnieuw ingesteld op de seed-waarde die voor de kolom is gedefinieerd. Als er geen seed is gedefinieerd, wordt de standaardwaarde 1
gebruikt. Als u het identiteitsitem wilt behouden, gebruikt u in plaats daarvan DELETE
.
Een TRUNCATE TABLE
bewerking kan worden teruggedraaid binnen een transactie.
Als u in Fabric SQL Database een tabel afkapt, worden alle gespiegelde gegevens uit Fabric OneLake voor die tabel verwijderd.
Beperkingen
U kunt TRUNCATE TABLE
niet gebruiken voor tabellen die:
Er wordt naar een
FOREIGN KEY
beperking verwezen. U kunt een tabel afkappen met een refererende sleutel die naar zichzelf verwijst.Deelnemen aan een geïndexeerde weergave.
Worden gepubliceerd met behulp van transactionele replicatie of samenvoegingsreplicatie.
Zijn tijdelijke systeemversies.
Er wordt naar een
EDGE
beperking verwezen.
Gebruik voor tabellen met een of meer van deze kenmerken in plaats daarvan de instructie DELETE
.
TRUNCATE TABLE
kan een trigger niet activeren omdat met de bewerking geen afzonderlijke rijverwijderingen worden vastgelegd. Zie CREATE TRIGGER (Transact-SQL)voor meer informatie.
In Azure Synapse Analytics and Analytics Platform System (PDW):
TRUNCATE TABLE
is niet toegestaan binnen de instructieEXPLAIN
.TRUNCATE TABLE
kan niet worden uitgevoerd binnen een transactie.
Grote tabellen afkappen
Microsoft SQL Server biedt de mogelijkheid om tabellen met meer dan 128 gebieden te verwijderen of af tekappen zonder gelijktijdige vergrendelingen vast te houden voor alle vereiste gebieden voor de afname.
Machtigingen
De minimale vereiste machtiging is ALTER
op table_name.
TRUNCATE TABLE
machtigingen zijn standaard ingesteld op de eigenaar van de tabel, leden van de vaste serverfunctie sysadmin en de db_owner en db_ddladmin vaste databaserollen, en zijn niet overdraagbaar. U kunt de instructie TRUNCATE TABLE
echter opnemen in een module, zoals een opgeslagen procedure, en de juiste machtigingen verlenen aan de module met behulp van de EXECUTE AS
-component.
Voorbeelden
Een. Een tabel afkappen
In het volgende voorbeeld worden alle gegevens uit de JobCandidate
tabel verwijderd.
SELECT
instructies worden vóór en na de TRUNCATE TABLE
instructie opgenomen om de resultaten te vergelijken.
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. Tabelpartities afkappen
Van toepassing op: SQL Server 2016 (13.x) en latere versies.
In het volgende voorbeeld worden opgegeven partities van een gepartitioneerde tabel afgekapt. De WITH (PARTITIONS (2, 4, 6 TO 8))
syntaxis zorgt ervoor dat partitienummers 2, 4, 6, 7 en 8 worden afgekapt.
TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO
C. Een afkappende bewerking terugdraaien
In het volgende voorbeeld ziet u dat een TRUNCATE TABLE
bewerking binnen een transactie kan worden teruggedraaid.
Maak een testtabel met drie rijen.
USE [tempdb]; GO CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL); GO INSERT INTO TruncateTest DEFAULT VALUES; GO 3
Controleer de gegevens voordat u afkappen.
SELECT * FROM TruncateTest; GO
Kap de tabel in een transactie af en controleer het aantal rijen.
BEGIN TRANSACTION; TRUNCATE TABLE TruncateTest; SELECT * FROM TruncateTest;
U ziet dat de tabel leeg is.
De transactie terugdraaien en de gegevens controleren.
ROLLBACK TRANSACTION; GO SELECT * FROM TruncateTest; GO
U ziet alle drie de rijen.
Schoon de tabel op.
DROP TABLE TruncateTest; GO
Verwante inhoud
-
DELETE (Transact-SQL) - DROP TABLE (Transact-SQL)
- CREATE TABLE (Transact-SQL) IDENTITY (eigenschap)