Istnieje tabela pracownicy z polami: id, imie, nazwisko, pensja. W nowym roku postanowiono podnieść pensję wszystkim pracownikom o 100 zł. Aktualizacja ta w bazie danych będzie miała postać
A.
UPDATE pracownicy SET pensja = pensja +100;
B.
UPDATE pensja SET +100;
C.
UPDATE pracownicy SET pensja = 100;
D.
UPDATE pensja SET 100;
Pytanie z egzaminu CKE, październik 2016 (arkusz E.14-X-16.08).
Instrukcja UPDATE pracownicy SET pensja = pensja + 100; jest właściwa, bo używa poprawnej składni SQL do modyfikowania danych w istniejących rekordach. Po słowie UPDATE podajemy nazwę tabeli, czyli pracownicy, a po SET wskazujemy kolumnę, którą chcemy zmienić. Wyrażenie pensja = pensja + 100 oznacza: weź aktualną wartość z kolumny pensja dla każdego rekordu i zapisz tam wartość większą o 100. Czyli jeśli ktoś miał 4200, po wykonaniu zapytania będzie miał 4300. Brak klauzuli WHERE jest tutaj celowy, ponieważ podwyżka dotyczy wszystkich pracowników. W praktyce trzeba jednak z tym uważać, bo UPDATE bez WHERE zmienia całą tabelę. Moim zdaniem to jedna z tych instrukcji, które warto zawsze czytać dwa razy przed uruchomieniem. Dobrą praktyką w branży jest wcześniejsze wykonanie kopii zapasowej albo użycie transakcji, np. START TRANSACTION, potem UPDATE, sprawdzenie wyniku i dopiero COMMIT. W systemach kadrowych kolumna pensja powinna mieć typ liczbowy, najczęściej DECIMAL, żeby uniknąć problemów z zaokrągleniami typowymi dla liczb zmiennoprzecinkowych.
W tym zadaniu kluczowe jest zrozumienie, że instrukcja UPDATE działa na tabeli, a nie bezpośrednio na samej kolumnie oderwanej od tabeli. Poprawny schemat jest dość prosty: UPDATE nazwa_tabeli SET nazwa_kolumny = nowe_wyrażenie. Jeżeli ktoś zapisuje UPDATE pensja, to traktuje pensję jak nazwę tabeli, a w podanym opisie pensja jest tylko polem w tabeli pracownicy. Baza danych musi wiedzieć, w której tabeli ma szukać tej kolumny, inaczej składnia jest błędna albo odnosiłaby się do zupełnie innego obiektu, gdyby taki istniał. Częsty błąd polega też na pomyleniu podniesienia pensji o 100 zł z ustawieniem pensji na 100 zł. Zapis SET pensja = 100 nie dodaje premii, tylko nadpisuje każdemu pracownikowi wynagrodzenie stałą wartością 100, co w prawdziwym systemie kadrowym byłoby dość katastrofalne. Równie niepoprawne jest samo SET +100, bo w SQL po SET trzeba przypisać wynik jakiegoś wyrażenia do konkretnej kolumny. Operator plus nie działa sam z siebie, musi mieć argumenty, np. pensja + 100, oraz miejsce, gdzie wynik zostanie zapisany. Warto też zapamiętać, że brak WHERE zwykle jest ryzykowny, ale tutaj akurat wymagany, bo zmiana dotyczy wszystkich rekordów. Z mojego doświadczenia takie pytania dobrze uczą ostrożności: SQL nie pyta, czy naprawdę chciałeś zmienić całą tabelę, tylko wykonuje polecenie, jeśli składnia jest poprawna.