W tym e‑materiale poznamy sposoby modyfikacji zawartości bazy danych na przykładzie bazy danych Pracownicy, którą zamieszczamy w wersjach dla programu LibreOffice Base oraz Microsoft Access. Odpowiedni plik należy pobrać i zapisać na dysku.
Baza danych Pracownicy dla programu Microsoft Access.
Plik ACCDB o rozmiarze 516.00 KB w języku polskim
Ćwiczenie 1
W wybranym programie otwórz pobraną bazę. Wykorzystaj widok projektu tabeli oraz widok relacji, aby poznać schemat bazy danych.
Baza zawiera cztery tabele.
W tabeli pracownicy występują pola:
id – INTEGER, liczba całkowita, klucz główny,
imie, nazwisko, ulica, kod, miasto – TEXT, krótki tekst,
data_urodz – DATE, data/godzina.
W tabeli place występują pola:
id_pracownika, id_stanowiska – INTEGER, liczba całkowita, klucze obce, które tworzą klucz główny,
data_zatr – DATE, data/godzina,
placa – DECIMAL, waluta.
W tabeli stanowiska występują pola:
id – INTEGER, liczba całkowita, klucz główny,
stanowisko – TEXT, krótki tekst.
W tabeli kontakty występują pola:
id – INTEGER, liczba całkowita, klucz główny,
id_pracownika – INTEGER, liczba całkowita, klucz obcy,
telefon, email – TEXT, krótki tekst.
Tabele pracownicy i kontakty łączy relacja jeden‑do‑wielu. Tabele pracownicy i stanowiska łączy relacja wiele‑do‑wielu definiowana przez relacje jeden‑do‑wielu z każdej z tych tabel do tabeli pośredniejtabela pośredniatabeli pośredniejplace.
Żeby wykonywać omówione dalej zapytania SQL w programie LibreOffice Base, wybieramy polecenie Narzędzia | SQL, natomiast w programie Microsoft Access wybieramy wstążkę Tworzenie, następnie Projekt kwerendy, zamykamy okno Pokazywanie tabeli i klikamy ikonę SQL.
Modyfikacja danych
Modyfikowanie danych to jedna z podstawowych operacji CRUDoperacje CRUDCRUD, które możliwe są do wykonania w bazie danych.
Przykład 1
Załóżmy, że zmieniamy profil działania firmy i nazwę stanowiska „goniec” należy zastąpić nazwą „kurier”. Jak odpowiednio zmienić dane w bazie?
Dzięki temu, że nazwy stanowisk są w osobnej tabeli stanowiska, a nie np. w tabeli place lub pracownicy, zmiany wymaga tylko jedna wartość. W języku SQL mamy instrukcję aktualizującą dane, której ogólna postać jest następująca:
Linia 1. UPDATE nazwa podkreślnik tabeli.
Linia 2. SET pole1 znak równości wartość przecinek pole2 znak równości wartość przecinek kropka kropka kropka.
Linia 3. WHERE warunek średnik.
UPDATE nazwa_tabeli
SET pole1 = wartość, pole2 = wartość, ...
WHERE warunek;
Wykorzystamy tę klauzulę do zmiany nazwy stanowiska. Na początku wyświetlimy listę stanowisk.
Linia 1. SELECT asterysk FROM stanowiska średnik.
SELECT * FROM stanowiska;
Na liście wyników powinniśmy zobaczyć rekord o identyfikatorze 7 i tekście „goniec” w polu stanowisko. Do wskazania rekordu, który chcemy zaktualizować, możemy użyć dotychczasowej nazwy stanowiska:
w LibreOffice Base:
Linia 1. UPDATE cudzysłów stanowiska cudzysłów.
Linia 2. SET cudzysłów stanowisko cudzysłów znak równości apostrof kurier apostrof.
Linia 3. WHERE cudzysłów stanowisko cudzysłów znak równości apostrof goniec apostrof średnik.
UPDATE "stanowiska"
SET "stanowisko" = 'kurier'
WHERE "stanowisko" = 'goniec';
w Microsoft Access:
Linia 1. UPDATE stanowiska.
Linia 2. SET stanowisko znak równości apostrof kurier apostrof.
Linia 3. WHERE stanowisko znak równości apostrof goniec apostrof średnik.
UPDATE stanowiska
SET stanowisko = 'kurier'
WHERE stanowisko = 'goniec';
W bazach danych obsługiwanych przez strony internetowe o wiele częściej rekordy wskazuje się przez klucze główne, które są osadzane w formularzach i przesyłane później do serwera. Nasze zapytanie może więc wyglądać również następująco:
w LibreOffice Base:
Linia 1. UPDATE cudzysłów stanowiska cudzysłów.
Linia 2. SET cudzysłów stanowisko cudzysłów znak równości apostrof kurier apostrof.
Linia 3. WHERE cudzysłów id cudzysłów znak równości 7 średnik.
UPDATE "stanowiska"
SET "stanowisko" = 'kurier'
WHERE "id" = 7;
w Microsoft Access:
Linia 1. UPDATE stanowiska.
Linia 2. SET stanowisko znak równości apostrof kurier apostrof.
Linia 3. WHERE id znak równości 7 średnik.
UPDATE stanowiska
SET stanowisko = 'kurier'
WHERE id = 7;
Korzystanie z kluczy głównych konieczne jest wtedy, gdy aktualizujemy dane w tabelach zależnych.
Przykład 2
W bazie danych przechowujemy informacje o telefonach i mailach pracowników. Załóżmy, że zmienił się telefon do pana Igora Majchrzaka i musimy zaktualizować tę informację w bazie.
W tabeli kontakty rekordy przyporządkowane są do pracowników za pomocą kluczy obcych, czyli unikalnych wartości kluczy głównych z tabeli pracownicy. Musimy więc odczytać identyfikator pracownika. Użyjemy zapytania:
w LibreOffice Base:
Linia 1. SELECT cudzysłów id cudzysłów FROM cudzysłów pracownicy cudzysłów.
Linia 2. WHERE cudzysłów imie cudzysłów znak równości apostrof Igor apostrof AND cudzysłów nazwisko cudzysłów znak równości apostrof Majchrzak apostrof średnik.
SELECT "id" FROM "pracownicy"
WHERE "imie" = 'Igor' AND "nazwisko" = 'Majchrzak';
w Microsoft Access:
Linia 1. SELECT id FROM pracownicy.
Linia 2. WHERE imie znak równości apostrof Igor apostrof AND nazwisko znak równości apostrof Majchrzak apostrof zamknij nawias okrągły średnik.
SELECT id FROM pracownicy
WHERE imie = 'Igor' AND nazwisko = 'Majchrzak');
Przedstawiona kwerenda zwraca identyfikator, który pozwala wskazać rekord odpowiadający danemu pracownikowi w tabeli zależnej. Użyjemy tej kwerendy w podzapytaniu, aby zmienić dane:
w LibreOffice Base:
Linia 1. UPDATE cudzysłów kontakty cudzysłów.
Linia 2. SET cudzysłów telefon cudzysłów znak równości apostrof 768123098 apostrof.
Linia 3. WHERE cudzysłów id podkreślnik pracownika cudzysłów znak równości otwórz nawias okrągły.
Linia 4. SELECT cudzysłów id cudzysłów FROM cudzysłów pracownicy cudzysłów.
Linia 5. WHERE cudzysłów imie cudzysłów znak równości apostrof Igor apostrof AND cudzysłów nazwisko cudzysłów znak równości apostrof Majchrzak apostrof zamknij nawias okrągły średnik.
UPDATE "kontakty"
SET "telefon" = '768123098'
WHERE "id_pracownika" = (
SELECT "id" FROM "pracownicy"
WHERE "imie" = 'Igor' AND "nazwisko" = 'Majchrzak');
w Microsoft Access:
Linia 1. UPDATE kontakty.
Linia 2. SET telefon znak równości apostrof 768123098 apostrof.
Linia 3. WHERE id podkreślnik pracownika znak równości otwórz nawias okrągły.
Linia 4. SELECT id FROM pracownicy.
Linia 5. WHERE imie znak równości apostrof Igor apostrof AND nazwisko znak równości apostrof Majchrzak apostrof zamknij nawias okrągły średnik.
UPDATE kontakty
SET telefon = '768123098'
WHERE id_pracownika = (
SELECT id FROM pracownicy
WHERE imie = 'Igor' AND nazwisko = 'Majchrzak');
Po wykonaniu kodu możemy użyć zapytania wybierającego wszystkie rekordy z tabeli kontakty do sprawdzenia, czy dane zostały zmienione.
Już wiesz
Gdy zmieniamy dane, podstawowym wymogiem jest poprawne skonstruowanie warunku identyfikującego rekordy przeznaczone do zmiany.
Usuwanie danych
Usuwanie, podobnie jak zmienianie danych, jest również jedną z podstawowych operacji CRUDoperacje CRUDCRUD implementowanych w każdej bazie.
Przykład 3
Załóżmy, że rozwiązaliśmy umowę o pracę z jednym z pracowników i chcemy usunąć dane tego pracownika z głównej bazy (w kopii będziemy mieli je dalej zachowane).
Przed usuwaniem danych możemy wykonać kopię przynajmniej najważniejszych informacji. Poniższe zapytania wybierają wszystkie rekordy z tabeli pracownicy i zapisują w tabeli pracownicy_kopia.
W LibreOffice Base:
Linia 1. SELECT asterysk INTO cudzysłów pracownicy podkreślnik kopia cudzysłów FROM cudzysłów pracownicy cudzysłów średnik.
SELECT * INTO "pracownicy_kopia" FROM "pracownicy";
Po wykonaniu tej operacji wybierz polecenie Widok | Odśwież tabele, aby tabela pracownicy_kopia pojawiła się na liście.
W Microsoft Access:
Linia 1. SELECT asterysk INTO pracownicy podkreślnik kopia FROM pracownicy średnik.
SELECT * INTO pracownicy_kopia FROM pracownicy;
Polecenie DELETE usuwa całe rekordy, dlatego poza wskazaniem tabeli podajemy warunek wybierający rekordy do usunięcia. Spróbujemy więc usunąć dane pracownika o identyfikatorze 4 (Uwaga! Mogą pojawić się problemy, które opisane zostały poniżej).
w LibreOffice Base:
Linia 1. DELETE FROM cudzysłów pracownicy cudzysłów WHERE cudzysłów id cudzysłów znak równości 4 średnik.
DELETE FROM "pracownicy" WHERE "id" = 4;
w Microsoft Access:
Linia 1. DELETE FROM pracownicy WHERE id znak równości 4 średnik.
DELETE FROM pracownicy WHERE id = 4;
Podczas próby wykonania zapytań w obydwu programach zobaczymy ostrzeżenie o naruszeniu integralności danych. Ostrzeżenia są wynikiem relacji, która łączy tabelę pracownicy i place: identyfikator pracownika o wartości 4 występuje w tabeli place jako klucz obcy.
W takim wypadku usunięcie danych o pracowniku z identyfikatorem 4 wymaga wcześniejszego usunięcia związanych z nim danych w tabelach powiązanych: place i kontakty. W sumie wykonujemy trzy zapytania:
w LibreOffice Base:
Linia 1. DELETE FROM cudzysłów place cudzysłów WHERE cudzysłów id podkreślnik pracownika cudzysłów znak równości 4 średnik.
Linia 2. DELETE FROM cudzysłów kontakty cudzysłów WHERE cudzysłów id podkreślnik pracownika cudzysłów znak równości 4 średnik.
Linia 3. DELETE FROM cudzysłów pracownicy cudzysłów WHERE cudzysłów id cudzysłów znak równości 4 średnik.
DELETE FROM "place" WHERE "id_pracownika" = 4;
DELETE FROM "kontakty" WHERE "id_pracownika" = 4;
DELETE FROM "pracownicy" WHERE "id" = 4;
w Microsoft Access wykonujemy zapytania pojedynczo:
Linia 1. DELETE FROM place WHERE id podkreślnik pracownika znak równości 4 średnik.
Linia 2. DELETE FROM kontakty WHERE id podkreślnik pracownika znak równości 4 średnik.
Linia 3. DELETE FROM pracownicy WHERE id znak równości 4 średnik.
DELETE FROM place WHERE id_pracownika = 4;
DELETE FROM kontakty WHERE id_pracownika = 4;
DELETE FROM pracownicy WHERE id = 4;
Zastanówmy się, czy zawsze konieczne jest usuwanie danych z tabel zależnych zanim usuniemy je z tabeli głównej. Wszystko zależy od sposobu zdefiniowania ograniczeń nałożonych na relacje łączące tabele.
W LibreOffice Base podczas definiowania relacji oprócz połączenia pól możemy zaznaczyć w narzędziu Opcje usuwania opcję Usuń kaskadowo:
RTlfA4wP1MnFJ
Zrzut ekranu przedstawia okno dialogowe zatytułowane Relacje. W opcjach Złączone tabele wpisano place oraz pracownicy. W opcjach Złączone pola, w kolumnie place wpisano id_pracownika, w kolumnie pracownicy wpisano id. Poniżej znajdują się opcje aktualizacji, wybrano Brak akcji. W opcjach usuwania wybrano usuń kaskadowo. Poniżej przyciski Pomoc, Ok, Anuluj.
Opcje tworzenia relacji w LibreOffice Base.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
W Microsoft Access oprócz wymuszania więzów integralności w oknie definiowania relacji możemy zaznaczyć Kaskadowo usuń rekordy pokrewne:
Rq3Yrehlwyofh
Zrzut ekranu przedstawia okno dialogowe zatytułowane Edytowanie relacji. Pokrewna tabela/kwerenda wybrano opcje pracownicy (id) i place (id_pracownika). Poniżej zaznaczono opcje Wymuszaj więzy integralności oraz Kaskadowo usuń rekordy pokrewne. Typ relacji ustawiony jest jako Jeden - do - wielu. Obok przyciski OK, Anuluj, Typ sprzężenia, Utwórz nowe.
Opcje edytowania relacji w Microsoft Access.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
W języku SQL ograniczenia te zdefiniowane musiałyby być w poleceniach tworzących tabele zależne przy użyciu klauzuli ON CASCADE, np.:
Linia 1. CREATE TABLE cudzysłów place cudzysłów otwórz nawias okrągły.
Linia 2. kropka kropka kropka.
Linia 3. FOREIGN KEY otwórz nawias okrągły cudzysłów id podkreślnik pracownika cudzysłów zamknij nawias okrągły REFERENCES cudzysłów pracownicy cudzysłów otwórz nawias okrągły cudzysłów id cudzysłów zamknij nawias okrągły.
Linia 4. ON DELETE CASCADE.
Linia 5. zamknij nawias okrągły średnik.
Podsumowując, jeżeli podczas definiowania relacji łączącej tabelę zależne z główną nałożono ograniczenie kaskadowego usuwania rekordów, do usunięcia danych – w tym wypadku pracownika – można użyć jednego polecenia, które próbowaliśmy wydać na początku.
Już wiesz
W usuwaniu danych kluczowe jest precyzyjne wskazywanie rekordu (bądź rekordów) poprzez odpowiedni warunek w klauzuli WHERE. W przeciwnym wypadku może dojść do utraty danych, które nie powinny być usunięte.
Instrukcja DELETE FROM nazwa_tabeli usuwa wszystkie rekordy z podanej tabeli.
Słownik
operacje CRUD
operacje CRUD
(ang. create, read, update, delete) zestaw podstawowych operacji wykonywanych na bazach danych, możliwość dodawania nowych danych (create), odczytywania ich (read), aktualizowania (update) i ich usuwania (delete)
schemat bazy
schemat bazy
schematyczny opis tabel (zwanych encjami), ich atrybutów (pól, kolumn) oraz ich typów danych, a także związków między tabelami, czyli relacji
tabela pośrednia
tabela pośrednia
tabela, która umożliwia tworzenie relacji wiele‑do‑wielu