Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Najlepsze sposoby użycia instrukcji SQL DELETE w tabeli SQL

W relacyjnych bazach danych tworzymy tabele do przechowywania danych w różnych formatach. SQL Server przechowuje dane w formacie wiersza i kolumny, który przechowuje wartość powiązaną z każdym typem danych. Projektując tabele SQL, definiujemy typy danych, takie jak liczba całkowita, liczba zmiennoprzecinkowa, liczba dziesiętna, varchar i bit. Na przykład tabela przechowująca dane klientów może zawierać pola, takie jak nazwa klienta, adres e-mail, adres, stan, kraj itd. W tabeli SQL wykonywane są różne polecenia SQL, które można podzielić na następujące kategorie:

  • Język definicji danych (DDL):  Te polecenia służą do tworzenia i modyfikowania obiektów bazy danych w bazie danych.
    • Utwórz:  Tworzy obiekty
    • Zmień:  Modyfikuje obiekty
    • Upuść:  Usuwa obiekty
    • Obetnij:  Usuwa wszystkie dane z tabeli
  • Język manipulacji danymi (DML):  Te polecenia wstawiają, pobierają, modyfikują, usuwają i aktualizują dane w bazie danych.
    • Wybierz:  Pobiera dane z jednej lub wielu tabel
    • Wstaw:  Dodaje nowe dane w tabeli
    • Aktualizacja:  Modyfikuje istniejące dane
    • Usuń:  Usuwa istniejące rekordy w tabeli

  • Język kontroli danych (DCL):  Te polecenia są powiązane z prawami lub kontrolami uprawnień w bazie danych.
    • Dotacja:  Przypisuje uprawnienia użytkownikowi
    • Unieważnij:  Odbiera uprawnienia użytkownikowi
  • Język kontroli transakcji (TCL):  Te polecenia kontrolują transakcje w bazie danych.
    • Potwierdź:  Zapisuje zmiany wprowadzone przez zapytanie
    • Wycofanie: Wycofuje jawną lub niejawną transakcję do początku transakcji lub do punktu zapisu wewnątrz transakcji
    • Zapisz transakcje:  Ustawia punkt zapisu lub znacznik w ramach transakcji

Załóżmy, że masz dane dotyczące zamówień klientów przechowywane w tabeli SQL. W przypadku ciągłego wstawiania danych do tej tabeli może ona zawierać miliony rekordów, co może powodować problemy z wydajnością w aplikacjach. Utrzymanie indeksu może również stać się niezwykle czasochłonne. Często nie trzeba zachowywać zamówień starszych niż trzy lata. W takich przypadkach możesz usunąć te rekordy z tabeli. Pozwoliłoby to zaoszczędzić miejsce do przechowywania, a także zmniejszyć nakłady na konserwację.

Możesz usunąć dane z tabeli SQL na dwa sposoby:

  • Korzystanie z instrukcji usuwania SQL
  • Korzystanie z skróconego

Różnice między tymi poleceniami SQL przyjrzymy się później. Najpierw przyjrzyjmy się instrukcji SQL delete.

Instrukcja usuwania SQL bez żadnych warunków

W instrukcjach języka manipulacji danymi (DML) instrukcja usuwania SQL usuwa wiersze z tabeli. Możesz usunąć określony wiersz lub wszystkie wiersze. Podstawowa instrukcja usuwania nie wymaga żadnych argumentów.

Stwórzmy tabelę Orders SQL za pomocą poniższego skryptu. Ta tabela ma trzy kolumny [OrderID], [ProductName] i [ProductQuantity].

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

Wstaw kilka rekordów w tej tabeli.

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

Załóżmy teraz, że chcemy usunąć dane z tabeli. Możesz określić nazwę tabeli, aby usunąć dane za pomocą instrukcji delete. Obie instrukcje SQL są takie same. Możemy określić nazwę tabeli z (opcjonalnego) słowa kluczowego lub określić nazwę tabeli bezpośrednio po usunięciu.

Delete Orders Go Delete from Orders GO

Instrukcja usuwania SQL z filtrowanymi danymi

Te instrukcje usuwania SQL usuwają wszystkie dane z tabeli. Zwykle nie usuwamy wszystkich wierszy z tabeli SQL. Aby usunąć określony wiersz, możemy dodać klauzulę where z instrukcją delete. Klauzula where zawiera kryteria filtrowania i ostatecznie określa, które wiersze należy usunąć.

Załóżmy na przykład, że chcemy usunąć identyfikator zamówienia 1. Po dodaniu klauzuli where SQL Server najpierw sprawdza odpowiednie wiersze i usuwa te konkretne.
Delete Orders where orderid=1

Jeśli warunek klauzuli where ma wartość fałszywą, nie usuwa żadnych wierszy. Na przykład usunęliśmy zamówione 1 z tabeli zamówień. Jeśli ponownie wykonamy instrukcję, nie znajdzie ona żadnych wierszy spełniających warunek klauzuli WHERE. W takim przypadku zwraca 0 wierszy, których dotyczy problem.

Instrukcja usuwania SQL i klauzula TOP

Możesz również użyć instrukcji TOP, aby usunąć wiersze. Na przykład poniższe zapytanie usuwa 100 pierwszych wierszy z tabeli Zamówienia.

Delete top (100) [OrderID] from Orders

Ponieważ nie określiliśmy żadnego „ORDER BY”, wybiera losowe wiersze i usuwa je. Możemy wykorzystać klauzulę Order by do sortowania danych i usuwania górnych wierszy. W poniższym zapytaniu sortuje [OrderID] w porządku malejącym, a następnie usuwa go z tabeli [Orders].

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

Usuwanie wierszy na podstawie innej tabeli

Czasami musimy usunąć wiersze na podstawie innej tabeli. Ta tabela może istnieć w tej samej bazie danych lub nie.

  • Wyszukiwanie tabeli

Do usunięcia tych wierszy możemy użyć metody wyszukiwania tabeli lub sprzężenia SQL. Na przykład chcemy usunąć wiersze z tabeli [Orders], które spełniają następujący warunek:

Powinien mieć odpowiednie wiersze w tabeli [dbo].[Klient].

Spójrz na poniższe zapytanie, tutaj mamy instrukcję select w klauzuli where instrukcji delete. SQL Server najpierw pobiera wiersze, które spełniają wymagania instrukcji select, a następnie usuwa te wiersze z tabeli [Orders] za pomocą instrukcji SQL delete.

Delete Orders where orderid in (Select orderid  from Customer)
  • Połączenie SQL

Alternatywnie możemy użyć złączeń SQL między tymi tabelami i usunąć wiersze. W poniższym zapytaniu łączymy tabele [Zamówienia]] z tabelą [Klient]. Sprzężenie SQL zawsze działa na wspólnej kolumnie między tabelami. Mamy kolumnę [OrderID], która łączy obie tabele razem.

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

Aby zrozumieć powyższe oświadczenie o usunięciu, zobaczmy rzeczywisty plan wykonania.

Zgodnie z planem wykonania wykonuje skanowanie obu tabel, pobiera pasujące dane i usuwa je z tabeli Zamówienia.

  • Wspólne wyrażenie tabelowe (CTE)

Możemy również użyć wspólnego wyrażenia tabelowego (CTE), aby usunąć wiersze z tabeli SQL. Najpierw definiujemy CTE, aby znaleźć wiersz, który chcemy usunąć.

Następnie łączymy CTE z tabelą SQL Orders i usuwamy wiersze.

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;

Wpływ na zakres tożsamości

Kolumny tożsamości w SQL Server generują unikatowe, sekwencyjne wartości dla Twojej kolumny. Służą przede wszystkim do jednoznacznej identyfikacji wiersza w tabeli SQL. Kolumna klucza podstawowego jest również dobrym wyborem dla indeksu klastrowego w SQL Server.

W poniższym skrypcie mamy tabelę [Pracownik]. Ta tabela ma identyfikator kolumny tożsamości.

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

Do tej tabeli wstawiliśmy 50 rekordów, które wygenerowały wartości tożsamości dla kolumny id.

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

Jeśli usuniemy kilka wierszy z tabeli SQL, nie resetuje to wartości tożsamości dla kolejnych wartości. Na przykład usuńmy kilka wierszy, które mają wartości tożsamości od 20 do 25.

Delete from employee where id between 20 and 25

Teraz przejrzyj rekordy tabeli.

Select * from employee where id>15

Pokazuje lukę w zakresie wartości tożsamości.

Instrukcja usunięcia SQL i dziennik transakcji

Usuwanie SQL rejestruje każde usunięcie wiersza w dzienniku transakcji. Załóżmy, że musisz usunąć miliony rekordów z tabeli SQL. Nie chcesz usuwać dużej liczby rekordów w jednej transakcji, ponieważ może to spowodować wykładniczy wzrost pliku dziennika i niedostępność bazy danych. Jeśli anulujesz transakcję w trakcie, cofnięcie wyciągu z kasy może zająć kilka godzin.

W takim przypadku należy zawsze usuwać wiersze w małych porcjach i regularnie zatwierdzać te porcje. Na przykład możesz usunąć partię 10 000 wierszy na raz, zatwierdzić ją i przejść do następnej partii. Kiedy SQL Server zatwierdzi porcję, wzrost dziennika transakcji może być kontrolowany.

 Najlepsze praktyki

  • Zawsze należy wykonać kopię zapasową przed usunięciem danych.
  • Domyślnie SQL Server używa transakcji niejawnych i zatwierdza rekordy bez pytania użytkownika. Najlepszym rozwiązaniem jest rozpoczęcie jawnej transakcji za pomocą opcji Rozpocznij transakcję. Daje kontrolę nad zatwierdzeniem lub wycofaniem transakcji. Powinieneś także często wykonywać kopie zapasowe dziennika transakcji, jeśli twoja baza danych jest w trybie pełnego odzyskiwania.
  • Chcesz usuwać dane w małych porcjach, aby uniknąć nadmiernego wykorzystania dziennika transakcji. Pozwala również uniknąć blokowania innych transakcji SQL.
  • Należy ograniczyć uprawnienia, aby użytkownicy nie mogli usuwać danych. Tylko autoryzowani użytkownicy powinni mieć dostęp do usuwania danych z tabeli SQL.
  • Chcesz uruchomić instrukcję delete z klauzulą ​​where. Usuwa przefiltrowane dane z tabeli SQL. Jeśli aplikacja wymaga częstego usuwania danych, dobrym pomysłem jest okresowe resetowanie wartości tożsamości. W przeciwnym razie możesz napotkać problemy z wyczerpaniem wartości tożsamości.
  • Jeśli chcesz opróżnić tabelę, zaleca się użycie instrukcji truncate. Instrukcja truncate usuwa wszystkie dane z tabeli, wykorzystuje minimalne rejestrowanie transakcji, resetuje zakres wartości tożsamości i jest szybsza niż instrukcja usuwania SQL, ponieważ natychmiast zwalnia wszystkie strony tabeli.
  • W przypadku korzystania z ograniczeń klucza obcego (relacja rodzic-dziecko) dla tabel, należy usunąć wiersz z wiersza podrzędnego, a następnie z tabeli nadrzędnej. Jeśli usuniesz wiersz z wiersza nadrzędnego, możesz również użyć opcji kaskadowej przy usuwaniu, aby automatycznie usunąć wiersz z tabeli podrzędnej. Więcej informacji znajdziesz w artykule:Usuwanie kaskadowe i aktualizowanie kaskadowe w kluczu obcym SQL Server.
  • Jeśli użyjesz instrukcji top do usunięcia wierszy, SQL Server usunie je losowo. Powinieneś zawsze używać górnej klauzuli z odpowiednią klauzulą ​​Order by i Group by.
  • Instrukcja usuwania uzyskuje wyłączną blokadę intencji w tabeli referencyjnej; dlatego w tym czasie żadne inne transakcje nie mogą modyfikować danych. Możesz użyć podpowiedzi NOLOCK do odczytania danych.
  • Należy unikać używania wskazówki dotyczącej tabeli w celu przesłonięcia domyślnego zachowania blokującego instrukcji SQL delete; powinien być używany tylko przez doświadczonych administratorów baz danych i programistów.

Ważne uwagi

Istnieje wiele korzyści z używania instrukcji usuwania SQL do usuwania danych z tabeli SQL, ale jak widać, wymaga to metodycznego podejścia. Ważne jest, aby zawsze usuwać dane w małych partiach i postępować ostrożnie podczas usuwania danych z wystąpienia produkcyjnego. Posiadanie strategii tworzenia kopii zapasowych w celu odzyskania danych w jak najkrótszym czasie jest koniecznością, aby uniknąć przestojów lub przyszłego wpływu na wydajność.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przedstawiamy wspólne wyrażenia tabelowe w SQL Server

  2. Jak działa OBJECTPROPERTYEX() w SQL Server

  3. Musisz zadeklarować zmienną skalarną @Id?

  4. Metody oceniania wierszy w programie SQL Server:ROW_NUMBER(), RANK(), DENSE_RANK() i NTILE()

  5. Jak zamienić wiele znaków w SQL?