sql >> Databáze >  >> RDS >> Sqlserver

Nejlepší způsoby použití příkazu SQL DELETE v tabulce SQL

V relačních databázích vytváříme tabulky pro ukládání dat v různých formátech. SQL Server ukládá data ve formátu řádků a sloupců, které obsahují hodnotu spojenou s každým typem dat. Když navrhujeme tabulky SQL, definujeme datové typy, jako je integer, float, decimal, varchar a bit. Například tabulka, která ukládá zákaznická data, může obsahovat pole, jako je jméno zákazníka, e-mail, adresa, stát, země a tak dále. Různé příkazy SQL se provádějí na tabulce SQL a lze je rozdělit do následujících kategorií:

  • Data Definition Language (DDL):  Tyto příkazy se používají k vytváření a úpravě databázových objektů v databázi.
    • Vytvořit:  Vytváří objekty
    • Změnit:  Upravuje objekty
    • Vypustit:  Odstraní objekty
    • Zkrácení:  Odstraní všechna data z tabulky
  • Jazyk manipulace s daty (DML):  Tyto příkazy vkládají, načítají, upravují, vymazávají a aktualizují data v databázi.
    • Vyberte:  Načítá data z jedné nebo více tabulek
    • Vložit:  Přidá nová data do tabulky
    • Aktualizace:  Upravuje existující data
    • Smazat:  Odstraní existující záznamy v tabulce

  • Data Control Language (DCL):  Tyto příkazy jsou spojeny s ovládacími prvky práv nebo oprávnění v databázi.
    • Grant:  Přiděluje uživateli oprávnění
    • Zrušit:  Odebere oprávnění od uživatele
  • Jazyk řízení transakcí (TCL):  Tyto příkazy řídí transakce v databázi.
    • Závazek:  Uloží změny provedené dotazem
    • Vrácení zpět: Vrátí explicitní nebo implicitní transakci na začátek transakce nebo do bodu uložení uvnitř transakce
    • Ukládání transakcí:  Nastavuje bod uložení nebo značku v rámci transakce

Předpokládejme, že máte data zákaznických objednávek uložená v tabulce SQL. Pokud byste neustále vkládali data do této tabulky, mohla by tabulka obsahovat miliony záznamů, což by ve vašich aplikacích způsobovalo problémy s výkonem. Údržba vašeho indexu může být také extrémně časově náročná. Často nemusíte uchovávat objednávky, které jsou starší než tři roky. V těchto případech můžete tyto záznamy z tabulky odstranit. To by ušetřilo úložný prostor a snížilo náklady na údržbu.

Data z tabulky SQL můžete odstranit dvěma způsoby:

  • Použití příkazu SQL delete
  • Použití zkrácení

Na rozdíl mezi těmito SQL příkazy se podíváme později. Nejprve prozkoumáme příkaz SQL delete.

Příkaz SQL delete bez jakýchkoli podmínek

V příkazech jazyka pro manipulaci s daty (DML) příkaz SQL odstraní řádky z tabulky. Můžete odstranit konkrétní řádek nebo všechny řádky. Základní příkaz delete nevyžaduje žádné argumenty.

Vytvořme tabulku Orders SQL pomocí níže uvedeného skriptu. Tato tabulka má tři sloupce [OrderID], [ProductName] a [ProductQuantity].

Create Table Orders (   OrderID int, ProductName varchar(50), ProductQuantity int )

Vložte do této tabulky několik záznamů.

Insert into Orders values (1,'ABC books',10), (2,'XYZ',100), (3,'SQL book',50)

Nyní předpokládejme, že chceme smazat data tabulky. Pomocí příkazu delete můžete zadat název tabulky pro odstranění dat. Oba příkazy SQL jsou stejné. Můžeme zadat název tabulky z (volitelného) klíčového slova nebo zadat název tabulky přímo po odstranění.

Delete Orders Go Delete from Orders GO

Příkaz SQL delete s filtrovanými daty

Tyto příkazy SQL delete odstraní všechna data tabulky. Obvykle neodstraňujeme všechny řádky z tabulky SQL. Chcete-li odstranit konkrétní řádek, můžeme přidat klauzuli where s příkazem delete. Klauzule where obsahuje kritéria filtru a případně určuje, které řádky se mají odstranit.

Předpokládejme například, že chceme odstranit ID objednávky 1. Jakmile přidáme klauzuli where, SQL Server nejprve zkontroluje odpovídající řádky a tyto konkrétní řádky odstraní.
Delete Orders where orderid=1

Pokud je podmínka klauzule where nepravdivá, neodstraní žádné řádky. Například jsme odstranili objednanou 1 z tabulky objednávek. Pokud provedeme příkaz znovu, nenajde žádné řádky, které by splnily podmínku klauzule where. V tomto případě vrátí 0 ovlivněných řádků.

Příkaz SQL delete a klauzule TOP

Pomocí příkazu TOP můžete také řádky smazat. Například níže uvedený dotaz odstraní prvních 100 řádků z tabulky Objednávky.

Delete top (100) [OrderID] from Orders

Protože jsme nezadali žádné „ORDER BY“, vybere náhodné řádky a odstraní je. Můžeme použít klauzuli Order by k třídění dat a odstranění horních řádků. V níže uvedeném dotazu seřadí [OrderID] v sestupném pořadí a poté jej odstraní z tabulky [Orders].

Delete from Orders where [OrderID] In ( Select top 100 [OrderID] FROM Orders order by [OrderID] Desc )

Odstranění řádků na základě jiné tabulky

Někdy potřebujeme odstranit řádky na základě jiné tabulky. Tato tabulka může nebo nemusí existovat ve stejné databázi.

  • Vyhledávání v tabulce

K odstranění těchto řádků můžeme použít metodu vyhledávání v tabulce nebo SQL join. Například chceme odstranit řádky z tabulky [Objednávky], které splňují následující podmínku:

Měl by mít odpovídající řádky v tabulce [dbo].[Customer].

Podívejte se na níže uvedený dotaz, zde máme příkaz select v klauzuli where příkazu delete. SQL Server nejprve získá řádky, které vyhovují příkazu select, a poté tyto řádky odstraní z tabulky [Orders] pomocí příkazu SQL delete.

Delete Orders where orderid in (Select orderid  from Customer)
  • Připojení k SQL

Případně můžeme použít SQL spojení mezi těmito tabulkami a odstranit řádky. V níže uvedeném dotazu spojujeme tabulky [Objednávky]] s tabulkou [Zákazník]. SQL spojení vždy funguje na společném sloupci mezi tabulkami. Máme sloupec [OrderID], který spojuje obě tabulky dohromady.

DELETE Orders FROM Orders o INNER JOIN Customer c ON o.orderid=c.orderid

Abychom porozuměli výše uvedenému prohlášení o odstranění, podívejme se na skutečný plán provádění.

Podle prováděcího plánu provede skenování tabulek na obou tabulkách, získá odpovídající data a odstraní je z tabulky Objednávky.

  • Common table expression (CTE)

Můžeme použít společný tabulkový výraz (CTE) k odstranění řádků z SQL tabulky. Nejprve definujeme CTE, abychom našli řádek, který chceme odstranit.

Poté spojíme CTE s tabulkou SQL Orders a odstraníme řádky.

WITH cteOrders AS (SELECT OrderID FROM Customer WHERE CustomerID = 1 ) DELETE Orders FROM cteOrders sp INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;

Dopady na rozsah identity

Sloupce identity na serveru SQL Server generují jedinečné sekvenční hodnoty pro váš sloupec. Používají se především k jednoznačné identifikaci řádku v SQL tabulce. Sloupec primárního klíče je také dobrou volbou pro seskupený index na serveru SQL.

Ve skriptu níže máme tabulku [Zaměstnanec]. Tato tabulka má ID sloupce identity.

Create Table Employee ( id int identity(1,1), [Name] varchar(50) )

Do této tabulky jsme vložili 50 záznamů, které vygenerovaly hodnoty identity pro sloupec id.

Declare @id int=1 While(@id<=50) BEGIN Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID)) Set @id=@id+1 END

Pokud odstraníme několik řádků z tabulky SQL, neresetuje to hodnoty identity pro následující hodnoty. Smažeme například několik řádků, které mají hodnoty identity 20 až 25.

Delete from employee where id between 20 and 25

Nyní si prohlédněte záznamy tabulky.

Select * from employee where id>15

Ukazuje mezeru v rozsahu hodnot identity.

Příkaz SQL delete a protokol transakcí

SQL delete zaznamenává každé odstranění řádku do protokolu transakcí. Předpokládejme, že potřebujete odstranit miliony záznamů z tabulky SQL. Nechcete odstranit velký počet záznamů v jedné transakci, protože by to mohlo způsobit exponenciální nárůst souboru protokolu a také může být nedostupná vaše databáze. Pokud transakci zrušíte uprostřed, může vrácení výpisu odstranění trvat hodiny.

V tomto případě byste měli vždy odstraňovat řádky po malých kouscích a pravidelně je zapisovat. Můžete například odstranit dávku 10 000 řádků najednou, potvrdit ji a přesunout se na další dávku. Když SQL Server potvrdí blok, lze řídit růst protokolu transakcí.

 Doporučené postupy

  • Před smazáním dat byste měli vždy provést zálohu.
  • Ve výchozím nastavení používá SQL Server implicitní transakce a potvrzuje záznamy bez dotazu uživatele. Nejlepším postupem je zahájit explicitní transakci pomocí možnosti Zahájit transakci. Poskytuje vám kontrolu nad potvrzením nebo vrácením transakce. Pokud je vaše databáze v režimu plné obnovy, měli byste také spouštět časté zálohy protokolu transakcí.
  • Chcete smazat data po malých částech, abyste se vyhnuli nadměrnému používání protokolu transakcí. Také se vyhne blokování pro další transakce SQL.
  • Měli byste omezit oprávnění, aby uživatelé nemohli smazat data. Pouze oprávnění uživatelé by měli mít přístup k odstranění dat z tabulky SQL.
  • Chcete spustit příkaz delete s klauzulí where. Odstraňuje filtrovaná data z tabulky SQL. Pokud vaše aplikace vyžaduje časté mazání dat, je dobré hodnoty identity pravidelně resetovat. V opačném případě můžete čelit problémům s vyčerpáním hodnoty identity.
  • V případě, že chcete tabulku vyprázdnit, je vhodné použít příkaz truncate. Příkaz truncate odstraní všechna data z tabulky, používá minimální protokolování transakcí, resetuje rozsah hodnot identity a je rychlejší než příkaz SQL delete, protože okamžitě uvolňuje všechny stránky pro tabulku.
  • V případě, že pro své tabulky používáte omezení cizího klíče (vztah nadřazený-podřízený), měli byste odstranit řádek z podřízeného řádku a poté z nadřazené tabulky. Pokud odstraníte řádek z nadřazeného řádku, můžete také použít možnost kaskády při odstranění k automatickému odstranění řádku z podřízené tabulky. Další informace naleznete v článku: Odstranit kaskádu a aktualizovat kaskádu v cizím klíči SQL Server.
  • Pokud k odstranění řádků použijete příkaz top, SQL Server odstraní řádky náhodně. Vždy byste měli použít horní klauzuli s odpovídající klauzulí Order by a Group by.
  • Příkaz delete získá výhradní zámek záměru v referenční tabulce; proto během této doby nemohou žádná další transakce data upravovat. Ke čtení dat můžete použít nápovědu NOLOCK.
  • Měli byste se vyhnout použití nápovědy k tabulce k přepsání výchozího chování zamykání příkazu SQL delete; měli by jej používat pouze zkušení správci databází a vývojáři.

Důležité úvahy

Použití příkazů SQL delete k odstranění dat z tabulky SQL má mnoho výhod, ale jak vidíte, vyžaduje to metodický přístup. Je důležité vždy mazat data v malých dávkách a při mazání dat z produkční instance postupovat opatrně. Aby se předešlo prostojům nebo budoucím dopadům na výkon, musíte mít strategii zálohování pro obnovu dat v minimálním čase.


  1. MariaDB MaxScale Load Balancing na Docker:Management:Část druhá

  2. Hibernate, Postgresql:Sloupec x je typu oid, ale výraz je typu byte

  3. Čtyři způsoby použití aplikace Microsoft Access

  4. Použití více polí pro jedinečný klíč v Prisma