T-SQL poskytuje dvě klíčová slova, která umožňují smazat data z tabulky. Jsou DELETE a ZKRÁTIT . Jsou si podobní v tom, co dělají, ale používají velmi odlišné metody. V tomto článku diskutujeme o základních mechanismech pro tato klíčová slova.
Rozdíl mezi TRUNCATE a DELETE
ZKRÁTIT:
- TRUNCATE je příkaz DDL.
- TRUNCATE TABLE vždy uzamkne tabulku a stránku. Nezamyká však každý řádek.
- Podmínku WHERE nelze použít.
- Příkaz odstraní všechna data.
- TRUNCATE TABLE nemůže aktivovat spouštěč, protože operace nezaznamenává smazání jednotlivých řádků.
- Rychlejší ve výkonu, protože neuchovává protokoly.
- Vrácení zpět je možné.
SMAZAT:
- DELETE je příkaz DML.
- Příkaz DELETE používá při provádění zámek řádku. Každý řádek v tabulce je uzamčen pro smazání.
- V klauzuli WHERE můžete zadat filtry.
- Příkaz smaže zadaná data, pokud existuje podmínka WHERE.
- DELETE aktivuje spouštěč, protože operace jsou protokolovány jednotlivě.
- DELETE je pomalejší než TRUNCATE, protože uchovává protokoly.
- Vrácení zpět je možné.
Jak smazat data pomocí TRUNCATE?
Následující příklad odstraní všechna data z tabulky Osoba. VYBRAT příkazy jsou zahrnuty před a za TRUNCATE TABLE prohlášení pro porovnání výsledků.
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO
Zdůrazněme některé výhody.
ZKRÁTIT TABULKU příkaz odstraní všechny řádky z tabulky uvolněním datových stránek používaných k uložení dat tabulky. Jakmile je operace dokončena, tabulka obsahuje nula stránek. Neprovádí žádné protokolování pro odstranění jednotlivých řádků. Příkaz zaznamená dealokaci stránky do transakčního protokolu. ZKRÁTIT příkaz používá méně místa v protokolu. Obvykle se používá méně zámků. Příkaz odstraní všechny řádky z tabulky, ale struktura tabulky a její sloupce, omezení, indexy atd. zůstanou zachovány. Chcete-li odstranit stůl. musíte použít DROP TABLE .
Pokud tabulka obsahuje sloupec identity, počítadlo pro tento sloupec se resetuje na počáteční hodnotu definovanou pro sloupec. Pokud nebyl definován žádný zdroj, použije se výchozí hodnota 1. Chcete-li zachovat počítadlo identity, použijte DELETE místo toho.
Odstranění všech řádků pomocí DELETE
Následující příklad odstraní všechny řádky z tabulky Osoba:
DELETE FROM Person.Person;
GO
SMAZAT odstraní řádky jeden po druhém. Příkaz přidá nový záznam do protokolu transakcí pro každý odstraněný řádek. SMAZAT používá při provádění zámek řádku, což znamená, že každý řádek v tabulce je uzamčen pro odstranění. Jednou DELETE Pokud se provede, může tabulka stále obsahovat prázdné datové stránky. Například prázdné stránky v haldě nelze uvolnit bez alespoň exkluzivního (LCK_M_X) zámku tabulky. SMAZAT a ZKRÁTIT obojí lze vrátit zpět při použití s TRANSACTION .
Přečtěte si také
Rozdíl mezi tabulkou DELETE a TRUNCATE v SQL Server