Jak dodać wiersz, jak zmienić wartości w istniejących rekordach i jak usunąć dane, żeby nie skasować całej tabeli. Składnia, kolejność kolumn, klucze obce i pułapka braku WHERE. Lekcja 8.3 kursu INF.03.
Trzy polecenia DML zmieniają zawartość tabeli: INSERT (WSTAW) dodaje wiersze, UPDATE (ZAKTUALIZUJ) zmienia wartości w wierszach, które już są, a DELETE (USUŃ) je kasuje. Na egzaminie pisemnym pytania pokazują tabelę przed zmianą i pytają, jak będzie wyglądać po. W części praktycznej czwarta kwerenda to najczęściej UPDATE, na przykład podniesienie ceny o dziesięć procent.
Tabela, na której pracujemy
id
nazwa
cena
kategoria
sztuk
1
Klawiatura
120
akcesoria
15
3
Monitor 24
650
monitory
4
4
Monitor 27
990
monitory
2
5
Kabel HDMI
25
akcesoria
NULL
Kolumna id ma AUTO_INCREMENT, nazwa i cena mają NOT NULL, a cena dodatkowo DEFAULT 0.
INSERT: dodawanie wierszy
Pełna postać wymienia kolumny, do których wstawiasz wartości:
INSERT INTO produkt (nazwa, cena, kategoria, sztuk)
VALUES ('Podkładka', 15, 'akcesoria', 40);
Kolejność wartości musi odpowiadać kolejności kolumn z nawiasu. Kolumny id nie podajemy, bo AUTO_INCREMENT sam wstawi kolejny numer. Kolumna pominięta na liście dostaje wartość DEFAULT, a gdy jej nie ma, NULL.
Krótsza postać, bez listy kolumn, wymaga podania wartości dla WSZYSTKICH kolumn tabeli, w kolejności z definicji:
INSERT INTO produkt VALUES (NULL, 'Podkładka', 15, 'akcesoria', 40);
NULL w miejscu id mówi bazie „wstaw kolejny numer sam". Ta postać jest krótsza, ale psuje się przy każdej zmianie struktury tabeli, więc w zadaniach pisz wersję z listą kolumn.
Kilka wierszy naraz zapisuje się jednym poleceniem, przecinkami:
INSERT INTO produkt (nazwa, cena, kategoria) VALUES
('Podkładka', 15, 'akcesoria'),
('Monitor 32', 1490, 'monitory'),
('Hub USB', 60, 'akcesoria');
Pułapka: liczba wartości musi się zgadzać z liczbą kolumn. Komunikat Column count doesn't match value count (liczba kolumn nie zgadza się z liczbą wartości) znaczy dokładnie to i jest częstym pytaniem o rozpoznanie błędu.
UPDATE: zmiana istniejących wartości
UPDATE produkt
SET cena = 135
WHERE id = 1;
SET (USTAW) wymienia kolumny i nowe wartości, WHERE wskazuje wiersze do zmiany. Można zmieniać kilka kolumn naraz, po przecinku:
UPDATE produkt
SET cena = 135, kategoria = 'peryferia'
WHERE nazwa = 'Klawiatura';
Nowa wartość może być wyliczona ze starej. Podwyżka o dziesięć procent dla monitorów:
UPDATE produkt
SET cena = cena * 1.1
WHERE kategoria = 'monitory';
Prawa strona cena * 1.1 bierze cenę Z TEGO wiersza, więc każdy monitor dostaje swoją nową cenę. Obniżka o 20 złotych to SET cena = cena - 20.
Pułapka: UPDATE bez WHERE zmienia WSZYSTKIE wiersze tabeli. To najczęstszy błąd na egzaminie praktycznym i najczęstsza odpowiedź w pytaniu „jaki będzie skutek wykonania polecenia".
Dobry nawyk: napisz najpierw SELECT * FROM produkt WHERE ... z tym samym warunkiem. Jeżeli wynik pokazuje dokładnie te wiersze, o które chodzi, zamień SELECT * na UPDATE ... SET.
Po wykonaniu porównaj ceny monitorów z tabelą powyżej. Przycisk przywróć bazę cofa zmianę:
DELETE: usuwanie wierszy
DELETE FROM produkt WHERE id = 5;
DELETE FROM produkt WHERE sztuk = 0;
Nie wymienia się kolumn, bo DELETE usuwa CAŁY wiersz. Nie da się nim usunąć jednej wartości; do tego służy UPDATE ... SET kolumna = NULL.
DELETE FROM produkt WHERE id = 5;
znika jeden wiersz
DELETE FROM produkt;
znikają wszystkie wiersze, tabela zostaje
TRUNCATE TABLE produkt;
to samo, szybciej, licznik AUTO_INCREMENT rusza od 1
DROP TABLE produkt;
znika też sama tabela
Kiedy baza odmówi
Zmiana danych bywa odrzucana i komunikat wskazuje przyczynę. Cztery sytuacje z arkuszy:
Sytuacja
Komunikat (skrót)
Dlaczego
brak wartości dla NOT NULL
Field 'nazwa' doesn't have a default value
kolumna wymagana, a INSERT ją pominął
powtórzony klucz główny albo UNIQUE
Duplicate entry '1' for key 'PRIMARY'
taka wartość już jest w tabeli
klucz obcy wskazuje na nieistniejący wiersz
Cannot add or update a child row
wstawiasz zamówienie klienta, którego nie ma
usuwasz wiersz, do którego ktoś się odwołuje
Cannot delete or update a parent row
klient ma zamówienia, a klucz obcy tego pilnuje
Dwa ostatnie przypadki to działanie klucza obcego, czyli więzy integralności. Baza nie pozwala zostawić zamówienia bez klienta i to jest jej zaleta, a nie błąd.
Kolejność przy wstawianiu do kilku tabel
Skrypt z arkusza wstawia dane w kolejności zależności: najpierw tabele nadrzędne, potem te z kluczami obcymi. Dla naszej bazy: klient i produkt, na końcu zamowienie. Odwrotna kolejność kończy się komunikatem Cannot add or update a child row.
Przy usuwaniu kolejność jest odwrotna: najpierw zamowienie, potem klient.
Na egzaminie
Pytania pisemne z tej lekcji: rozpoznanie skutku UPDATE bez WHERE, wskazanie polecenia, które doda wiersz („INSERT INTO czy UPDATE"), policzenie wierszy po DELETE z warunkiem oraz rozpoznanie komunikatu o błędzie. Pojawia się też pytanie o to, co zrobi DELETE bez WHERE w porównaniu z DROP.
W części praktycznej czwarta kwerenda to zwykle UPDATE opisany słowami, na przykład „podnieś cenę wszystkich wycieczek o 10%". Zapisz polecenie w pliku z kwerendami, wykonaj je w phpMyAdmin i zrób zrzut ekranu. Po wykonaniu UPDATE phpMyAdmin pokazuje liczbę zmienionych wierszy, więc od razu widać, czy warunek był dobry.
Ściąga
dodanie wiersza
INSERT INTO t (kol1, kol2) VALUES ('a', 1);
kilka wierszy naraz
INSERT INTO t (kol) VALUES ('a'), ('b'), ('c');
numer nadawany sam
pomiń kolumnę id albo wstaw NULL
zmiana wartości
UPDATE t SET kol = 'nowa' WHERE id = 1;
zmiana wyliczona ze starej
UPDATE t SET cena = cena * 1.1 WHERE ...;
usunięcie wierszy
DELETE FROM t WHERE warunek;
bezpiecznik
najpierw SELECT z tym samym WHERE
kolejność wstawiania
tabele nadrzędne przed tabelami z kluczem obcym
Pobierz ściągę PDF