Ten artykuł zawiera podstawowe informacje o języku SQL DELETE
instrukcje, których początkujący mogą używać do usuwania danych ze swoich tabel bazy danych.
Usuń pojedynczy wiersz
Oto podstawowy przykład polecenia SQL DELETE
oświadczenie.
DELETE FROM Owners
WHERE OwnerId = 5;
W tym przypadku usuwamy wiersz, w którym OwnerId
kolumna ma wartość 4
.
DELETE
instrukcja zaczyna się od DELETE FROM
, a następnie nazwa tabeli (tj. tabela zawierająca dane, które chcesz usunąć).
W niektórych systemach zarządzania bazami danych (DBMS), FROM
słowo kluczowe jest opcjonalne, ale dobrym pomysłem jest jego uwzględnienie dla lepszej przenośności (w przypadku, gdy musisz uruchomić ten sam kod w innym DBMS).
Zawsze należy dołączyć WHERE
klauzuli, chyba że chcesz usunąć wszystkie wiersze z tabeli.
Tak, dobrze to przeczytałeś. Pominięcie WHERE
klauzula usunie wszystkie wiersze w tabeli.
Większość DBMS ma różne inne opcje, których można użyć z DELETE
oświadczenie, ale te wymienione tutaj są najczęściej używane.
Zwróć uwagę, że DELETE
instrukcja usuwa cały wiersz. Nie można usunąć wartości pojedynczej kolumny w wierszu. Aby to zrobić, użyj SQL UPDATE
oświadczenie.
Przykład
W tym przykładzie usuwamy dane z tabeli.
Przede wszystkim zobaczmy, co jest w tabeli.
SELECT * FROM Owners;
Wynik:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
OK, usuńmy właściciela numer 5, a następnie ponownie wybierz tabelę.
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
Wynik:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Widzimy, że ostatni wiersz został usunięty zgodnie z opisem.
Klucze obce
Możesz otrzymać błąd, jeśli spróbujesz usunąć dane, do których odwołuje się klucz obcy w innej tabeli. Dzieje się tak, ponieważ tabela, z której próbujesz usunąć dane, jest tabelą nadrzędną w relacji. Tabela z kluczem obcym (tabela podrzędna) opiera się na danych z tabeli nadrzędnej (tj. danych, które próbujesz usunąć).
To, czy pojawi się błąd, czy nie, zależy od konfiguracji klucza obcego. Większość DBMS obsługuje różne opcje radzenia sobie z tą sytuacją. Takie opcje mogą obejmować zgłoszenie błędu, kaskadowe usunięcie do tabeli kluczy obcych (tj. usunięcie wiersza z tabeli podrzędnej), ustawienie klucza obcego na NULL
lub ustawiając ją na wartość domyślną.
Oto przykład próby usunięcia wiersza, do którego odwołuje się klucz obcy.
DELETE FROM Owners
WHERE OwnerId = 3;
Wynik:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
W tym przypadku został zgłoszony błąd i wiersz nie został usunięty.
W tym przykładzie Owners.OwnerId
kolumna jest kluczem podstawowym tej tabeli. Kolejna tabela o nazwie Pets
ma OwnerId
kolumna, która odwołuje się do tej kolumny klucza podstawowego, aw tym przypadku co najmniej jeden wiersz odwołuje się do numeru właściciela 3.
Gdybym naprawdę chciał usunąć ten wiersz, musiałbym zaktualizować dane w tabeli podrzędnej, aby żadne wiersze nie wskazywały tego właściciela. Albo zmodyfikuj klucz obcy, aby używał innej opcji, gdy operacje usuwania są wykonywane na kluczu podstawowym. Modyfikowanie klucza obcego może być niepożądaną opcją, w zależności od tego, co musisz zrobić. W zależności od systemu DBMS może to również wymagać usunięcia istniejącego klucza i odtworzenia go.
W każdym razie ten błąd jest dobrą rzeczą, ponieważ ostrzega nas o problemie, który pojawi się, jeśli usuniemy ten wiersz. Pomaga wymusić integralność referencyjną.
Uwaga! Zapominanie WHERE
Klauzula
DELETE
oświadczenie może być bardzo niebezpieczne. Jeśli pominiesz WHERE
klauzula, usuniesz wszystkie wierszy w tabeli.
Na szczęście możesz zostać uratowany przez ograniczenia klucza obcego, jeśli spróbujesz usunąć dane z tabeli nadrzędnej relacji.
Ale co, jeśli tak nie jest. Co się stanie, jeśli w instrukcjach usuwania nie pojawią się żadne błędy?
Dowiedzmy Się!
Uruchommy kolejne DELETE
oświadczenie, ale tym razem zapomnimy dołączyć WHERE
klauzula. Ponadto, tym razem uruchomimy go na tabeli, która nie jest rodzicem w związku.
Najpierw zobaczmy, co jest w tabeli.
SELECT * FROM Pets;
Wynik:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
OK, więc mamy osiem zwierzaków. Widzimy, że trzy zwierzaki należą do właściciela numer 3 – właściciela, którego próbowaliśmy usunąć w poprzednim przykładzie. Właśnie dlatego otrzymaliśmy błąd.
W każdym razie przejdźmy dalej i uruchom nasze DELETE
instrukcja bez WHERE
klauzuli, a następnie ponownie sprawdź tabelę
DELETE FROM Pets;
SELECT * FROM Pets;
Wynik:
(8 rows affected) (0 rows affected)
(8 rows affected)
część oznacza, że osiem wierszy zostało usuniętych.
(0 rows affected)
część oznacza, że nie wybrano żadnych wierszy (ponieważ w tabeli nie ma wierszy).
Ups!
Może się zdarzyć, że będziesz musiał usunąć wszystkie wiersze w tabeli. W zależności od wielkości stołu, to oświadczenie będzie wszystkim, czego potrzebujesz.
Jeśli chcesz usunąć większą tabelę, dostępna jest również opcja TRUNCATE TABLE
, który usuwa wszystkie wiersze z tabeli lub określonych partycji tabeli, bez rejestrowania usunięć poszczególnych wierszy (pole DELETE
oświadczenie rejestruje te usunięcia).
Dlatego TRUNCATE TABLE
jest szybszy i zużywa mniej zasobów systemowych i dzienników transakcji.
Przykład użycia TRUNCATE TABLE
:
TRUNCATE TABLE Owners;
Należy zauważyć, że może to nie zadziałać, jeśli do tabeli odwołuje się ograniczenie klucza obcego, nawet jeśli nie ma wierszy podrzędnych. W takich przypadkach DELETE
może działać zamiast tego.