Które polecenie zmniejszy o 5 wartość pola liczba_sztuk w tabeli Magazyn dla towaru o identyfikatorze 7?
A.
UPDATE liczba_sztuk SET liczba_sztuk-5 WHERE id = 7;
B.
UPDATE Magazyn, liczba_sztuk-5 WHERE id = 7;
C.
UPDATE Magazyn SET liczba_sztuk WHERE id = 7;
D.
UPDATE Magazyn SET liczba_sztuk = liczba_sztuk - 5 WHERE id = 7;
Polecenie UPDATE Magazyn SET liczba_sztuk = liczba_sztuk - 5 WHERE id = 7; ma poprawną składnię i dokładnie wykonuje to, o co chodzi w pytaniu. UPDATE wskazuje tabelę, czyli Magazyn, potem SET określa, które pole ma zostać zmienione. Zapis liczba_sztuk = liczba_sztuk - 5 oznacza: weź aktualną wartość z kolumny liczba_sztuk i zapisz w tej samej kolumnie wartość mniejszą o 5. Warunek WHERE id = 7 jest bardzo ważny, bo ogranicza zmianę tylko do jednego towaru o identyfikatorze 7. Bez WHERE zmniejszyłby się stan magazynowy wszystkich produktów, co w praktyce byłoby raczej grubą awarią danych. Moim zdaniem to jeden z tych przykładów, które dobrze pokazują sens SQL w pracy z magazynem, sklepem internetowym czy systemem sprzedaży. W realnym projekcie warto jeszcze sprawdzić, czy liczba_sztuk nie spadnie poniżej zera, np. przez dodatkowy warunek liczba_sztuk >= 5, albo obsłużyć to w logice aplikacji i transakcji. Dobra praktyka to też kontrola liczby zmodyfikowanych rekordów po wykonaniu zapytania.
W tym zadaniu łatwo pomylić samą operację matematyczną z poprawną składnią polecenia SQL. W języku SQL nie wystarczy napisać liczba_sztuk-5, bo baza danych musi dostać pełną informację, do której kolumny ma zapisać nową wartość. Przy aktualizacji danych używa się konstrukcji UPDATE nazwa_tabeli SET kolumna = nowa_wartość WHERE warunek. Kluczowe jest więc słowo SET oraz operator przypisania =. Bez tego baza nie wie, czy chodzi o obliczenie, filtr, nazwę pola, czy może o nazwę tabeli. Częsty błąd polega też na traktowaniu nazwy kolumny jak nazwy tabeli. Po UPDATE musi wystąpić tabela, czyli w tym przypadku Magazyn, a nie liczba_sztuk, bo aktualizujemy rekordy w tabeli, a dopiero później wskazujemy kolumnę do zmiany. Samo SET liczba_sztuk WHERE id = 7 też nie ma sensu, bo brakuje wartości, która ma zostać wpisana do pola. Baza danych oczekuje przypisania, na przykład liczba_sztuk = liczba_sztuk - 5. Warto zapamiętać, że WHERE nie zmienia danych, tylko wybiera rekordy objęte zmianą. Z mojego doświadczenia najgroźniejsze są zapytania UPDATE pisane na szybko, bo mały błąd składniowy zatrzyma zapytanie, ale brak dobrego warunku WHERE może zmienić bardzo dużo rekordów. Dlatego w praktyce często najpierw sprawdza się rekord poleceniem SELECT, a dopiero potem wykonuje UPDATE.