CodeGym /Kursy /SQL SELF /Aktualizacja danych z użyciem UPDATE

Aktualizacja danych z użyciem UPDATE

SQL SELF
Poziom 21 , Lekcja 2
Dostępny

Dzisiaj dotrzemy do kolejnego ważnego klocka Twojej nowej bazy wiedzy — aktualizacji danych. Zobaczymy, jak w PostgreSQL zmieniać istniejące informacje za pomocą komendy UPDATE. Dlaczego to ważne? No bo w prawdziwym życiu dane nie są statyczne. Wyobraź sobie, że Twój kumpel zmienił numer telefonu albo student przeniósł się do innej grupy — oczywiście chcesz zaktualizować te dane w bazie.

Kiedy Twoja szkolna miłość Swietka Sokołowa nagle stała się Swietką Chaczaturian (no bo takie jest życie), to wymaga zmian w Twojej bazie danych. Sytuacje, gdzie trzeba zaktualizować dane, zdarzają się często:

  • Poprawianie błędów w rekordzie.
  • Aktualizacja informacji (przeprowadzka, zmiana statusu).
  • Masowa zmiana danych, np. podwyżka pensji pracownikom.

Aktualizacja danych to sposób na zmianę wartości jednej lub kilku kolumn dla jednego lub kilku wierszy tabeli, bez dodawania nowych rekordów.

Składnia komendy UPDATE

Komenda UPDATE w PostgreSQL ma całkiem przejrzystą składnię. Zobaczmy, jak to wygląda:

UPDATE tabela
SET kolumna1 = wartość1,
    kolumna2 = wartość2
WHERE warunek;

Wyjaśnienia:

  • tabela: nazwa tabeli, w której coś zmieniamy.
  • SET kolumna = wartość: parametr, który określa, którą kolumnę zmieniamy i na jaką wartość.
  • WHERE warunek: warunek wskazuje, które wiersze mają być zaktualizowane (mega ważne, żeby nie zmienić wszystkiego naraz).

Kluczowy szczegół: jeśli zapomnisz dodać WHERE (albo zrobisz to źle), Twoje zmiany dotkną wszystkich wierszy w tabeli. To może się źle skończyć.

Przykład: zmiana imienia studenta

Załóżmy, że mamy tabelę students z kolumnami id, name, email. Chcemy zmienić imię studenta z id = 1 na "Maria Chi".

UPDATE students
SET name = 'Maria Chi'
WHERE id = 1;

Ta komenda znajdzie wiersz z id = 1 i zaktualizuje kolumnę name na nową wartość. Proste, nie?

Aktualizacja kilku kolumn naraz

Często trzeba zmienić kilka wartości w jednym rekordzie. Na przykład, wyobraź sobie, że student zmienił nie tylko imię, ale i adres e-mail. Tak to zrobisz:

UPDATE students
SET name = 'Otto Lin',
    email = 'otto.lin@example.com'
WHERE id = 2;

Tutaj aktualizujemy zarówno name, jak i email dla studenta z id = 2. PostgreSQL pozwala podać kilka par kolumna=wartość oddzielonych przecinkiem w sekcji SET.

Aktualizacja wielu wierszy

A co jeśli trzeba zmienić dane dla kilku wierszy naraz? Na przykład chcesz przenieść grupę studentów do nowych grup. Do tego można zaktualizować wiersze spełniające określone kryterium. Załóżmy, że mamy pole group_number i chcemy przenieść wszystkich studentów z grupy 101 do grupy 202:

UPDATE students
SET group_number = 202
WHERE group_number = 101;

Ta komenda zaktualizuje wszystkie wiersze, gdzie group_number równa się 101, zamieniając go na 202.

5. Warunek WHERE: uważaj!

Jak już było powiedziane, WHERE — to Twój ratunek. Bez niego zapytanie dotknie wszystkich wierszy tabeli. Na przykład, poniższa komenda zaktualizuje GRUPĘ wszystkich studentów, a nie tylko tych z grupy 101. Tego na pewno nie chcesz:

UPDATE students
SET group_number = 202;

Proszę, zawsze dodawaj WHERE, jeśli nie chcesz przypadkiem rozwalić danych. Lepiej dmuchać na zimne.

Myśl o komendzie UPDATE jak o poleceniu, które zmienia kolumny tabeli, a nie wiersze. Jej celem jest przypisanie wszystkim komórkom danej kolumny określonej wartości. I tylko obecność WHERE sprawia, że zmieniają się nie wszystkie wiersze.

Aktualizacja na podstawie danych z innej tabeli

Czasem trzeba nie tylko „wpisać” wartość ręcznie, ale zaktualizować wartości w tabeli A, używając danych z tabeli B. Taka sytuacja zdarza się często — szczególnie jeśli dane są rozdzielone: np. wyliczenia w jednej tabeli, a profile użytkowników — w drugiej.

Załóżmy, że mamy tabelę students, w której trzeba zaktualizować kolumnę debt, używając tabeli payments, gdzie trzymana jest aktualna wysokość zadłużenia (due_amount). Każdemu rekordowi w students odpowiada rekord w payments po polu student_id.

Składnia wygląda tak:

UPDATE students
SET debt = payments.due_amount
FROM payments
WHERE students.id = payments.student_id;

Co się dzieje:

  • PostgreSQL używa FROM payments jako źródła danych.
  • Po WHERE łączy wiersze między tabelami.
  • Aktualizuje tylko te wiersze students, które mają odpowiednik w payments.

Ważne: w tym UPDATE ... FROM tak naprawdę dzieje się ukryty JOIN, tylko bez słowa kluczowego JOIN.

Chodzi o to, że pod spodem jest ukryty JOIN. W praktyce wygląda to mniej więcej tak:

UPDATE students
SET debt = p.due_amount
FROM payments p
    JOIN students s ON s.id = p.student_id
WHERE students.id = p.student_id;

Jak sprawdzić, co dokładnie się zaktualizuje

Zanim odpalisz UPDATE, bardzo rozsądnie jest zobaczyć, co dokładnie się zmieni. Możesz to zrobić za pomocą SELECT napisanego według tego samego schematu:

SELECT
    students.id, 
    students.name, 
    students.debt AS old_debt, 
    payments.due_amount AS new_debt
FROM students
    JOIN payments ON students.id = payments.student_id;

Wynik pokaże:

  • starą wartość długu (old_debt);
  • nową wartość, która przyjdzie z tabeli payments (new_debt).

Taki sposób pomaga sprawdzić poprawność logiki, zanim na zawsze nadpiszesz dane.

Potencjalne pułapki

  • Jeśli payments zawiera więcej niż jeden rekord dla jednego studenta, UPDATE rzuci błąd: more than one row returned. Trzeba wtedy użyć agregacji (MAX, SUM, LIMIT 1) albo upewnić się, że student_id w payments jest unikalny.
  • Pamiętaj, że UPDATE ... FROM to specyficzna cecha PostgreSQL i nie działa tak samo w niektórych innych bazach (np. MySQL).

Praktyczne przykłady

Przykład 1: Zmiana statusu studentów

Załóżmy, że studenci, którzy ukończyli kurs, dostają status "absolwent". Mamy kolumnę status. Żeby zaktualizować status dla studentów z completed_course = true:

UPDATE students
SET status = 'absolwent'
WHERE completed_course = true;

Przykład 2: Podwyżka pensji pracownikom

Jeśli masz tabelę employees i chcesz zwiększyć pensję o 10% wszystkim, którzy pracują w dziale sprzedaży:

UPDATE employees
SET salary = salary * 1.10
WHERE department = 'Sales';

Tutaj używamy operacji matematycznej bezpośrednio w sekcji SET. To wygodne przy masowych zmianach.

Przykład 3: Warunkowa aktualizacja

Czasem trzeba zaktualizować dane w zależności od warunku. Na przykład, jeśli pensja pracownika jest mniejsza niż 50 000, powinna wzrosnąć o 20%, a jeśli większa — o 10%:

UPDATE employees
SET salary = CASE
                WHEN salary < 50000 THEN salary * 1.20
                ELSE salary * 1.10
             END;

Ta komenda używa konstrukcji CASE, żeby ustalić różne zasady aktualizacji w zależności od wartości salary.

Typowe błędy przy użyciu UPDATE

Pewnie już się domyślasz, jaki jest najpopularniejszy błąd? Tak, to pominięcie WHERE. Wyobraź sobie sytuację: masz bazę z 10 000 pracowników, a przez pomyłkę podniosłeś pensję wszystkim naraz. Nawet jeśli pracownicy się ucieszą, dla Twojej kariery to może być… nie za fajne.

Inny częsty błąd — aktualizacja złej kolumny. Zawsze sprawdzaj, co i gdzie zapisujesz. Prosty SELECT przed UPDATE może zaoszczędzić Ci masę czasu.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION