Rozeznáváme 2 typy příkazu, které slouží k mazání dat – SQL příkazy DELETE a TRUNCATE (viz článek mazání dat v tabulce – TRUNCATE). Každý je jiny a hodí se pro jinou situaci.
Syntaxe DELETE (první varianta je optional):
nebo
Mazání velkého množství záznamů opatrně
Pomocí příkazu můžeme z tabulky vymazat záznamy a na rozdíl od TRUNCATE zde můžeme stanovit podmínku. Pokud podmínku nestanovíme, je smazána celá tabulka. Pokud příkaz nad tabulkou pustíme, je celý průběh zaznamenávám v transakčním logu. Proto je v tomto případě lepší použít TRUNCATE, protože je transakční log zatížen jen minimálně a průběh je daleko rychlejší
U mazání velkého počtu záznamů se nám tím pádem může tato operace dost protáhnout. Navíc nám transakční log během operace dost nabobtná. Mazáním většího počtu záznamů může také dojít k locku celé tabulky. Pokud se chcete těmto problémům vyhnout, tak při použití v tomto příkazu nad velkým množstvím záznamů iterujte po předem daném množství mazaných záznamů, viz. cyklus:
Syntaxe DELETE pro velké množství záznamů
WHILE 1 = 1
BEGIN
DELETE TOP (1000) FROM dbo.Tabulka
WHERE Podminka
IF @@rowcount < 1000 BREAK;
END
Skript bude mazat po 1000 záznamech a cyklus přeruší pokud bude počet vymazaných záznamů nižší než 1000 = došlo k poslední iteraci.
Syntaxe na základě JOIN
DELETE FROM dbo.Tabulka
FROM dbo.Tabulka AS A
INNER JOIN dbo.Tabulka_2 AS B
ON A.ID = B.ID
WHERE B.Podminka;
Rozdíl DELETE vs TRUNCATE v SQL Server
Oba dva příkazy mažou z tabulky záznamy, existuje však mezi nimi řada rozdílů
- Transakční log – zapisuje každý vymazaný záznam do transakčního logu a zpomaluje se tak celá operace
- Indexované View – DELETE statement na rozdíl od TRUNCATE můžeme aplikovat na indexované view
- Podmínka – u mazání můžeme stanovit podmínku, použít JOINY a common table expression