[ Pobierz całość w formacie PDF ]
1:
UPDATE Klasy SET Poziom = 2, Profil='MI' WHERE Poziom=1;
Wszystkie klasy pierwsze stają się klasami drugimi i jednocześnie profil każdej zostaje zmieniony na
matematyczno-informatyczny (jeśli był inny).
Strona 42 z 44
DELETE i DROP TABLE
Polecenie DELETE usuwa rekordy z tabeli. W MySQL ma ono dwie wersje: dla jednej tabeli i dla kilku
tabel. W pierwszej wersji w poleceniu podaje się (opcja FROM) nazwę tabeli, z której mają być usuwane
rekordy oraz kryterium wyboru rekordów do usunięcia (opcja WHERE identyczna jak w SELECT). Oto
operacje związane z końcem roku szkolnego: usunięcie wszystkich uczniów ostatnich klas i samych tych klas
(możemy przyjąć, że dane z tych tabel zostały odpowiednio zarchiwizowane i będą mogły być użyte, gdy zajdzie
potrzeba). W kolejnym roku obecne klasy poziomu 2 staną się klasami poziomu 3.
# USUNICIE WSZYSTKICH KLAS POZIOMU 3
DELETE FROM Klasy WHERE Poziom=3;
W poleceniu DELETE nie piszemy, jakie kolumny usuwamy, ale z jakiej tabeli (usuwamy cały rekord). Nie
można usunąć tylko jednej lub kilku wybranych kolumn w rekordzie. Jeśli chce się je 'wyzerować' czyli nadać
im wartość 0, ciąg pusty czy wartość NULL, trzeba użyć polecenia UPDATE (wartość NULL można nadawać
także w inny sposób, patrz następna strona). Jeśli nie poda się opcji WHERE, z tabeli zostaną usunięte wszystkie
rekordy.
Sprawa się nieco komplikuje, gdy w grę wchodzi więcej niż jedna tabela, np. chcemy usuwać rekordy z
jednej tabeli, ale do ich wybrania potrzebujemy użyć innej tabeli. Załóżmy, że chcemy usunąć z naszej bazy
wszystkich uczniów, którzy chodzili do klas trzecich, ale nie chcemy usuwać samych klas trzecich (tegoroczni
uczniowie klas drugich w przyszłym roku przejdą do tych klas). Oto kwerenda (MySQL)
DELETE Uczniowie FROM Uczniowie, Klasy
WHERE Uczniowie.Klasa_Id = Klasy.Id AND Klasy.Poziom=3;
Opcja WHERE określa kryteria wyboru rekordów, ale usuwane będą tylko rekordy z tabeli Uczniowie.
DELETE usuwa zawartość tabeli, ale nie ją samą. Można ją z powrotem zapełnić za pomocą
odpowiednich poleceń INSERT. Polecenie DROP TABLE usuwa zawartość całej tabeli i ją samą:
DROP TABLE Uczniowie;
Gdyby chcieć użyć takiego polecenia na koniec roku, usunięte by zostały nie tylko rekordy uczniów z
klas trzecich (ostatnich), ale także wszystkie inne.
Ostrożnie z usuwaniem rekordów:
To, co się dzieje z usuniętym rekordem, zależy od konkretnego systemu RDBMS. W niektórych systemach rekord
usunięty za pomocą DELETE, chociaż nie jest już uwzględniany w kwerendach, nadal istnieje w tabeli, tyle że
jest oznaczony jako usunięty właśnie. Po to by go usunąć z tabeli fizycznie, trzeba wydać specjalne polecenie
(najczęściej nazywa się ono PACK). Operację usunięcia rekordu można anulować, wydając polecenie
UNDELETE. W innych bazach (także w MySQL) nie ma operacji anulowania usunięcia rekordu (po to, by
odzyskać usunięte rekordy, trzeba sięgać do różnych specjalnych środków, wymagających dobrej znajmości
systemu).
Strona 43 z 44
Jeszcze o integralności referencyjnej
Na poprzedniej stronie podane jest polecenie usuwające wszystkie rekordy klas poziomu 3.
Syntaktycznie jest to polecenie poprawne, ale jest z nim pewien problem (cały czas mówimy o tabelach
kursowych). Otóż po usunięciu z tabeli klas rekordów klas trzecich w tabeli uczniów pozostaną rekordy uczniów
z tych klas, z błędnym kluczem obcym Klasa_Id (nie będzie on identyfikował już żadnej klasy). Jest to
naruszenie integralności referencyjnej (RI - Referential Integrity). Pytanie: jak sobie z tym radzić?
W większości systemów RDBMS istnieje tzw. opcja operacji kaskadowych. Dla przykładu można
określić (jak, patrz niżej), że jeśli usuwa się rekord w tabeli, to mają być automatycznie usunięte rekordy z tabeli
powiązanej, zawierające - jako klucz obcy - wartość klucza podstawowego usuwanego rekordu. W odniesieniu
do tabel kursowych: po usunięciu rekordu klasy usuwane by były rekordy wszystkich uczniów przypisanych do
niej. A ponieważ taka operacja może być zbyt radykalna - usuwamy klasę, ale chcemy zachować rekordy
uczniów - można również zadeklarować, że po usunięciu rekordu z tabeli Klasy, w rekordach uczniów
należących do tej klasy jako wartość klucza obcego Klasa_Id zostanie wstawiona wartość NULL (przynależność
ucznia do klasy staje się nieokreślona). Podamy przykład takiej deklaracji (realizuje się to przy definiowaniu
tabeli) w odniesieniu do tabel kursowych. Najpierw definicja tabeli rodzica (Klasy):
CREATE TABLE Klasy ( id INT NOT NULL, ... PRIMARY KEY (id));
I definicja powiązanej z nią tabeli dziecka (Uczniowie) z opcją usuwania kaskadowego:
CREATE TABLE Uczniowie (id INT, ... Klasa_id INT,
FOREIGN KEY (Klasa_id) REFERENCES Klasy(Id) ON DELETE CASCADE);
Przy usunięciu rekordu z tabeli Klasy usunięte zostaną wszystkie rekordy z tabeli Uczniowie,
zawierające jako klucz obcy wartość klucza podstawowego usuwanego rekordu Klasy. A teraz druga podobna
definicja, w której zamiast usuwania rekordu deklaruje się wstawianie do niego wartości NULL:
CREATE TABLE Uczniowie (id INT, parent_id INT,
... FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE SET NULL);
Po usunięciu rekordu z tabeli Klasy powiązane z nim rekordy w tabeli Uczniowie zostaną zachowane,
ale klucz obcy Klasa_Id otrzyma w nich wartość NULL (nieokreślony).
Przy tabelach klas i uczniów termin 'kaskada' wydać się może nieco przesadny. Istnieją systemy, gdzie
rzeczywiście usunięcie rekordu z jednej tabeli może pociągać za sobą usunięcie setek jeśli nie tysięcy rekordów
z wielu innych tabel. Wyobrazmy sobie np. system zarządzania sprzedażą i kontaktami z klientem (CRM -
Customer Relationship Management). Po usunięciu rekordu klienta następuje cała kaskada operacji usuwających
z bazy wszystkie informacje pozostałe po kliencie. Usuwane są zatem kolejno wszystkie rekordy opisujące
kontakty z nim (e-mail, telefon, rozmowa, fax etc.), rekordy opisujące jakie produkty zakupił, rekordy opisujące
zgłoszenia serwisowe klienta itd. A za każdym takim rekordem mogą iść następne rekordy z innych tabel. Jeśli
[ Pobierz całość w formacie PDF ]