Encyklopedia SQL - Kasowanie danych - DELETE  

Udostępnij na: Facebook

Autor: Paweł Wilkosz

Opublikowano: 2012-01-30

W tej części z cyklu „Encyklopedia SQL” skupimy się już na ostatniej operacji CRUD (Create, Read, Update, Delete) – a mianowicie na klauzuli DELETE, odpowiedzialnej za usuwanie rekordów, tabel bądź obiektów z relacyjnej bazy danych.

Przed wykonaniem zadań zapoznaj się z następującym materiałem:

Po wykonaniu zadań będziesz wiedział:

  • w jaki sposób wykorzystać klauzulę DELETE do kasowania obiektów bazodanowych.

Operator DELETE i warunki ograniczające

Na wstępie chciałbym uwrażliwić Cię na jedną dosyć istotną kwestię. Opierając się na własnym doświadczeniu zawodowym, w bazodanowym środowisku produkcyjnym, praktycznie nie ma powodu, dla którego należałoby wykorzystywać polecenie DELETE do kasowania informacji. Usuwanie danych niesie za sobą poważne konsekwencje, m.in. utratę istotnych informacji, które zostały skasowane przez przypadek, nieprecyzyjne raporty, np. ze sprzedaży produktów, wykrywanie błędów w kwerendach, bądź aplikacjach pracujących bezpośrednio na bazie danych itp. Niemniej jednak polecenie takie w języku T-SQL istnieje i w pewnych okolicznościach posiada praktyczne zastosowanie. Przypadki te zostały opisane w dalszej części artykułu.

Tymczasem chciałbym zaprezentować Ci podstawową składnię polecenia DELETE. W najprostszej postaci zapytanie, korzystające z funkcji kasowania danych, przyjmuje następującą postać:

DELETE FROM [Tabela/Obiekt bazodanowy]

Powyższy kod usuwa wszystkie rekordy z tabeli wymienionej po słowie kluczowym FROM. Wykonanie zapytania na dowolnej tabeli nie jest dobrym rozwiązaniem, dlatego znacznie częściej spotkasz się ze składnią polecenia DELETE, wykorzystującą warunek ograniczania usuwanych rekordów za pomocą znanej już klauzuli WHERE. Zapytanie DELETE z WHERE wygląda następująco:

DELETE FROM [Tabela/Obiekt bazodanowy]
WHERE warunek_logiczny

Aby lepiej zobrazować niniejszy problem, posłużę się kolejnym przypadkiem użycia. W artykule: Kopiowanie danych między tabelami - SELECT INTO, firma AdventureWorks przeprowadzała szkolenia dla nowych pracowników. W tym celu dział IT przygotował dwie tabele: Production.ProductTEST oraz Production.ProductSalesTEST, kopiując dane odpowiednio z Production.Product oraz Production.ProductSales. Ponieważ szkolenie zajmowało zbyt dużo czasu, a kursanci mieli rozproszoną uwagę przez wzgląd na ogrom danych w tabelach, dział HR zwrócił się do programistów baz danych, żeby usunęli z tabeli Production.ProductTEST wszystkie rekordy o numerze identyfikacyjnym większym niż 320. Nie zastanawiając się długo, programiści wykonali następujące zapytanie:

DELETE FROM Production.Product
WHERE ProductID > 320

Co zwróciło wynik zgodny z oczekiwanym (Rys. 1.).

Rys. 1. Wynik działania zapytania DELETE z klauzulą WHERE.

Wśród trenerów i szkoleniowców coraz bardziej popularne stają się gry symulacyjne, gdzie np. nowi pracownicy mogą przećwiczyć konkretne scenariusze, zachowania itp., z którymi spotkają się w codziennej pracy. Wychodząc naprzeciw nowoczesnym trendom, firma AdventureWorks postanowiła przeprowadzić podobną grę w ramach kursu dla sprzedawców. Chciała, aby nowi pracownicy sami zapełnili bazę danych Production.ProductSalesTEST produktami, które uda im się sprzedać na wirtualnych aukcjach. Ponieważ w tabeli Production.ProductSalesTEST znajdowały się już wpisy skopiowane z tabeli Production.ProductSales, przewodniczący kursu poprosił dział IT o usunięcie wszystkich danych i pozostawienie tabeli pustej. W tym celu programiści przygotowali i wykonali następujące zapytanie:

DELETE FROM Production.ProductSalesTEST

co przyczyniło się do osiągnięcia zamierzonego celu. Wynik działania zapytania został przedstawiony na Rys. 2.

Rys. 2. Wynik działania zapytania kasującego wszystkie rekordy ze wskazanej tabeli.

Kiedy należy stosować DELETE?

Jak już wspomniałem na wstępie niniejszej publikacji, operator DELETE jest niezwykle niebezpieczny, dlatego jego wykorzystanie nie powinno być nadużywane. W kolejnej części publikacji chciałbym przedstawić sytuacje, w których wykorzystanie operatora DELETE jest wskazane.

Operator DELETE może zostać użyty, gdy:

  • do produkcyjnej bazy danych trafią informacje, które nie powinny się w niej znaleźć,
  • dane przechowywane w tabelach nie przyczyniają się do eksploracji wiedzy wykorzystywanej do raportowania, statystyk, porównywania itp.,
  • zmieniana jest struktura tabel/obiektów bazy danych,
  • kasowane są nadmiarowe dane,
  • wykorzystuje się praktyki czyszczenia danych np. zbędne logi.

Co zatem zrobić w sytuacji, gdy informacja nie jest potrzebna pod względem komercyjnym, ale niezwykle ważna dla systemów raportowania? W takim przypadku można posłużyć się flagą o nazwie np. IsActive, służącą do rozróżnienia, które rekordy powinny być brane pod uwagę, a które nie. Dla przykładu, projektując tabelę Pracownik, zawierającą dane osoby zatrudnionej, tj. imię, nazwisko, adres, e-mail, można dołożyć kolumnę jest_aktywny o typie danych np. BIT. będzie będzie ona informować użytkownika bazy danych, czy dany pracownik aktualnie pracuje w firmie, czy już nie. Jeżeli przejdzie na emeryturę, wystarczy ustawić flagę jest_aktywny z 1 na 0. Przy miesięcznym rozliczeniu wynagrodzenia, wszystkich aktywnych pracowników można wyciągnąć następującym zapytaniem:

SELECT imie, nazwisko
FROM Pracownik
WHERE jest_aktywny = 1

Jeżeli rekord pracownika zamiast zmiany statusu jest_aktywny zostałby usunięty, firma utraci ważne informacje, związane np. z aktywnością zawodową (ile rowerów sprzedał w ciągu okresu zatrudnienia), gdyż informacje zawarte w tabelach sprzedażowych odnoszą się do pustych rekordów w tabeli Pracownik. Na tej podstawie trudno jest ustalić kto w firmie został pracownikiem dekady albo nawet i stulecia!

Informacja

Zapamiętaj, że:

  1. Polecenie DELETE służy do usuwania danych z obiektów bazodanowych.
  2. Podobnie jak pozostałe klauzule CRUD, DELETE ma możliwość ograniczania zbioru informacji, podlegającemu usunięciu, np. za pomocą klauzuli WHERE.
  3. Jeżeli nie ma bezpośredniego powodu do usuwania danych, lepiej jest zastosować kolumnę typu jest_aktywny. DELETE spowoduje bezpowrotne usunięcie informacji, co może mieć wpływ na późniejsze wyniki raportowania, statystyki, integralność bazy danych.

Podsumowanie

W niniejszej publikacji poznałeś polecenie DELETE, umożliwiające usuwanie obiektów z bazy danych. Poznałeś również techniki ograniczania zbioru, podlegającemu kasowaniu, oraz najlepsze praktyki, związane z oznaczaniem rekordów jako aktywnych/nieaktywnych, co niewątpliwie stanowi alternatywę dla mało bezpiecznego polecenia DELETE.

W kolejnej publikacji nauczysz się, jakie typy danych dla kolumn oraz skalarnych wartości oferuje język T-SQL.

Dodatkowo zobacz: