T-SQL indeholder to nøgleord, der giver dig mulighed for at slette data fra en tabel. De er SLET og TRUNCATE . Disse er ens i det, de laver, men de bruger vidt forskellige metoder. I denne artikel diskuterer vi de underliggende mekanismer for disse søgeord.
En forskel mellem TRUNCATE og DELETE
TRUNCATE:
- TRUNCATE er en DDL-kommando.
- TRUNCATE TABLE låser altid tabellen og siden. Det låser dog ikke hver række.
- WHERE-betingelsen kan ikke bruges.
- Kommandoen fjerner alle data.
- TRUNCATE TABLE kan ikke aktivere en trigger, fordi handlingen ikke logger individuelle rækkesletninger.
- Hurtigere i ydeevne, fordi den ikke fører logs.
- Tilbageføring er mulig.
SLET:
- DELETE er en DML-kommando.
- DELETE-sætning bruger en rækkelås, mens den udføres. Hver række i tabellen er låst til sletning.
- Du kan angive filtre i WHERE-sætningen.
- Kommandoen sletter specificerede data, hvis WHERE-tilstanden eksisterer.
- DELETE aktiverer en trigger, fordi handlingerne logges individuelt.
- DELETE er langsommere end TRUNCATE, fordi det fører logfiler.
- Tilbageføring er mulig.
Hvordan sletter man data ved hjælp af TRUNCATE?
Det følgende eksempel fjerner alle data fra tabellen Person. VÆLG sætninger er inkluderet før og efter TRUNCATE TABLE erklæring for at sammenligne resultater.
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO
Lad os fremhæve nogle fordele.
TRUNCATE TABLE kommandoen sletter alle rækker fra en tabel ved at deallokere de datasider, der bruges til at gemme tabeldataene. Når handlingen er afsluttet, indeholder tabellen nul sider. Den logger ikke for de enkelte rækkesletninger. Kommandoen registrerer sidedeallokering til transaktionsloggen. TRUNCATE kommandoen bruger mindre logplads. Der bruges typisk færre låse. Kommandoen sletter alle rækker fra en tabel, men tabelstrukturen og dens kolonner, begrænsninger, indekser og så videre forbliver. For at fjerne bordet. du skal bruge DROP TABLE .
Hvis en tabel indeholder en identitetskolonne, nulstilles tælleren for den kolonne til den frøværdi, der er defineret for kolonnen. Hvis der ikke er defineret frø, bruges standardværdien 1. Brug SLET for at beholde identitetstælleren i stedet.
Sletning af alle rækker ved at bruge DELETE
Følgende eksempel sletter alle rækker fra Person-tabellen:
DELETE FROM Person.Person;
GO
SLET fjerner rækker én ad gangen. Kommandoen tilføjer den nye post til transaktionsloggen for hver slettede række. SLET bruger en rækkelås under udførelse, hvilket betyder, at hver række i tabellen er låst til sletning. En gang SLET udføres, kan en tabel stadig indeholde tomme datasider. For eksempel kan tomme sider i heapen ikke deallokeres uden mindst en eksklusiv (LCK_M_X) tabellås. SLET og TRUNCATE begge kan rulles tilbage, når de bruges med TRANSACTION .
Læs også
Forskellen mellem DELETE og TRUNCATE tabel i SQL Server